poj 3280 Cheapest Palindrome
2017-09-29 21:37
441 查看
http://poj.org/problem?id=3280
经典区间dp图,给出一个由小写字母组成的字符串,在给出每一个出现字母删去或加上的代价,问令原串变成回文串的最小代价。
实际上删去和添加没有区别,例如a[i]和a[j]不相同,那么想要变成回文串,就要让a[j+1]的位置加上一个a[i]或者是将a[i]去掉,最后的结果对其他字符是没影响的。随意对于给出的删去和添加的代价,从中取最小为真正的代价即可。
那么关键就是状态转移了,用2重循环去扫字符串的2个位置,dp[i][j]表示从i到j变成回文串的最小价值,那么就存在一下情况。
a[i]=a[j] dp[i][j]=dp[i+1][j-1]
dp[i+1][j]已经是个回文串了,那么dp[i][j]=min(dp[i][j],dp[i+1][j]+cost[a[i]])(这里删去和添加是没区别的)
dp[i][j-1]已经是个回文串了,那么dp[i][j]=min(dp[i][j],dp[i][j-1]+cost[a[j]])(这里删去和添加是没区别的)
经典区间dp图,给出一个由小写字母组成的字符串,在给出每一个出现字母删去或加上的代价,问令原串变成回文串的最小代价。
实际上删去和添加没有区别,例如a[i]和a[j]不相同,那么想要变成回文串,就要让a[j+1]的位置加上一个a[i]或者是将a[i]去掉,最后的结果对其他字符是没影响的。随意对于给出的删去和添加的代价,从中取最小为真正的代价即可。
那么关键就是状态转移了,用2重循环去扫字符串的2个位置,dp[i][j]表示从i到j变成回文串的最小价值,那么就存在一下情况。
a[i]=a[j] dp[i][j]=dp[i+1][j-1]
dp[i+1][j]已经是个回文串了,那么dp[i][j]=min(dp[i][j],dp[i+1][j]+cost[a[i]])(这里删去和添加是没区别的)
dp[i][j-1]已经是个回文串了,那么dp[i][j]=min(dp[i][j],dp[i][j-1]+cost[a[j]])(这里删去和添加是没区别的)
#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std;int dp[2222][2222]; int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { string a; memset(dp,0,sizeof(dp)); cin>>a; int i,j,k; int cos[222]; char le; int ad,de; for(i=1;i<=n;i++) { cin>>le>>ad>>de; cos[le]=min(ad,de); } for(i=1;i<a.size();i++) { for(j=0,k=i;k<a.size();j++,k++) { dp[j][k]=99999999; if(a[j]==a[k])dp[j][k]=dp[j+1][k-1]; else { dp[j][k]=min(dp[j][k],dp[j+1][k]+cos[a[j]]); dp[j][k]=min(dp[j][k],dp[j][k-1]+cos[a[k]]); } } } printf("%d\n",dp[0][a.size()-1]); } return 0; }
相关文章推荐
- POJ 3280 Cheapest Palindrome
- POJ 3280 Cheapest Palindrome
- poj 3280 Cheapest Palindrome 区间dp
- [区间dp] poj 3280 Cheapest Palindrome
- Cheapest Palindrome poj 3280 (区间dp)
- POJ-3280 Cheapest Palindrome 动态规划求回文串
- poj 3280 Cheapest Palindrome
- POJ 3280 Cheapest Palindrome
- POJ-3280 Cheapest Palindrome 区间DP
- poj 3280 Cheapest Palindrome【区间DP】
- POJ 3280 Cheapest Palindrome【DP】
- poj 3280 Cheapest Palindrome
- poj3280 Cheapest Palindrome
- poj 3280 Cheapest Palindrome
- Poj 3280 Cheapest Palindrome【区间dp】
- POJ 3280 —— Cheapest Palindrome
- POJ_3280_Cheapest_Palindrome_(动态规划)
- poj 3280 Cheapest Palindrome
- 【poj 3280】 Cheapest Palindrome 题意&题解&代码(C++)
- POJ 3280 Cheapest Palindrome