poj 3280 回文字符串问题 dp算法
题意:给一个字符串,构成回文(空也是回文) 其中增删都需要代价。问:代价最少?
思路:把字符串s变空 dp[i][j]表示变成回文的最小代价
for(i=m-1;i>=0;--i)
for(j=i+1;i<w;j++)lsdjfl
dp[i][j]=min(dp[i+1][j]+cost[s[i]-'a']],dp[i][j-1]+cost[s[j]-'a'])
if(s[i]==s[j]) dp[i][j]=min(dp[i][j],dp[i+1][j-1])
其中cost表示增删中最小代价
解决问题的代码:
#include <iostream> #include <string> #include <algorithm> #include <cstdio> using namespace std; int dp[2048][2048]; int cost[48]; int main() { int n, m; cin >> n >> m; string s; cin >> s; for (int i = 0; i < n; i++) { int add, del; char c; cin >> c >> add >> del; cost[c - 'a'] = min(add, del); } for(int i=m-1;i>=0;--i) for (int j = i + 1; j < m; j++) { dp[i][j] = min(dp[i + 1][j] + cost[s[i] - 'a'], dp[i][j - 1] + cost[s[j] - 'a']); if (s[i] == s[j]) dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]); } printf("%d\n", dp[0][m - 1]); return 0; }
君子知命不惧,自当日日自新