poj 3280 Cheapest Palindrome——DP

9861 단어 heap
먼저 잘못된 생각을 했는데... 아이고, 아직도 생각이 진화가 안되네...
우선 추가와 삭제가 똑같다는 것을 발견해야 하기 때문에cost를 선택할 때 delete와dd의 작은 값만 선택하면 됩니다.
상태 전환 방정식:
if(st[i]==st[j])
dp[i][j]=dp[i+1][j-1];
else if(st[i]!=st[j])
dp[i][j]=max(dp[i+1][j]+cost[st[i]-'a'],dp[i][j-1]+cost[st[j]-'a']);
기억화 검색으로 해결하고 있습니다.국경 상황에 주의해라, 그렇지 않으면 수색하여 죽을 것이다.
//time:157MS
//memory:16260K
#include<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<algorithm>
#include
<cmath>
int dp[2005][2010];
int cost[30];
char st[2010];
int min(int a,int b)
{
return a>b?b:a;
}
int DP(int i,int j)
{
if(i==j)
return dp[i][j]=0;
if(dp[i][j]>=0)
return dp[i][j];
if(st[i]==st[j])
{
if(i+1==j)
return dp[i][j]=0;// , ……
return dp[i][j]=DP(i+1,j-1);
}
else
{
return dp[i][j]=min(DP(i+1,j)+cost[st[i]-'a'],DP(i,j-1)+cost[st[j]-'a']);
}
}
int main(void)
{
int n,m;
while(scanf("%d %d",&n,&m)==2)
{
memset(dp,
-1,sizeof(dp));
memset(cost,
0,sizeof(cost));
memset(st,
0,sizeof(st));
if(!m)
{
puts(
"0");
continue;
}
scanf(
"%s",st+1);
int i;
for(i=1;i<=n;i++)
{
char s[10];
int a,b;
scanf(
"%s %d %d",s,&a,&b);
cost[s[
0]-'a']=min(a,b);
}
printf(
"%d
",DP(1,m));
}
}

좋은 웹페이지 즐겨찾기