[CODEVS1520] 메모 문자열(dp)
제목 설명
전송문
문제풀이
바보 같은 문제가 나로 하여금 여러 번 WA를 하게 했다.codevs는 gets로 정말 똥을 먹을 수 없습니다 = f (i, j) 를 설정하면 i~j 이 단락에 최소한 몇 개를 삽입할 수 있는지 표시합니다.그러면
f(i,j)={f(i+1,j−1),s[i]=s[j]min{f(i+1,j),f(i,j+1)}+1
상기 두 가지 조건은if와else가 될 수 없다는 것을 주의해야 한다. 즉, s[i]=s[j]가 만족하든 만족하지 않든min을 취해야 한다. 왜냐하면 가장 좋은 해답은 어디에서 얻었는지 보장할 수 없기 때문이다.
초기화
f(i,i)=1,f(i,i+1)={0,s[i]=s[i+1]1,s[i]!=s[i+1]
처음에 f(i,i+1)가 s[i]를 빠뜨렸어요!s[i+1]의 경우.역시 내가 너무 어리석었어.
코드
#include
#include
#include
using namespace std;
#define N 1005
char s[N];
int n,f[N][N];
void in()
{
char ch=getchar();
while (ch<'0'&&ch>'z') ch=getchar();
while (ch>='0'&&ch<='z') s[++n]=ch,ch=getchar();
}
int main()
{
in();
memset(f,127,sizeof(f));
for (int i=1;i<=n;++i) f[i][i]=0;
for (int i=1;iif (s[i]==s[i+1]) f[i][i+1]=0;
else f[i][i+1]=1;
for (int len=3;len<=n;++len)
for (int l=1;l<=n-len+1;++l)
{
int r=l+len-1;
if (s[l]==s[r]) f[l][r]=min(f[l][r],f[l+1][r-1]);
f[l][r]=min(f[l][r],f[l+1][r]+1);
f[l][r]=min(f[l][r],f[l][r-1]+1);
}
printf("%d
",f[1][n]);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
49일차 - 2022.04.20Baekjoon에서 문제풀이 1) 문제 : 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제/ 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 첫째 줄부터 N번째 줄까지 차례대로 별...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.