POJ 3280 Cheapest Palindrome (将一个字符串变为回文串的最小代价) 区间dp
2018-02-01 16:11
471 查看
题意:给你一个字符串,对于每个字符添加或删除都要付出一定代价,问你把这个字符串变为回文串的最小代价是什么。
首先构造数组 dp[i][j]表示从i到j是回文串所花费的代价,因为添加一个字符和删除一个字符对于回文串是等价的,所以取二者代价更小的就行。len是字符串的长度。则dp的范围是第一层 i 从len-1到0,第二层是从i+1到len-1。这样当构造dp[i][j]为回文串时。只能从dp[i+1][j]和dp[i][j+1]入手,而二者变为回文串的代价已经知道了。所以递推式如下:
当str[i] == str[j]时:
dp[i][j]=dp[i+1][j−1]dp[i][j]=dp[i+1][j−1]
当stri] != str[j]时:
dp[i][j]=min(dp[i+1][j]+cost[i],dp[i][j−1]+cost[j])dp[i][j]=min(dp[i+1][j]+cost[i],dp[i][j−1]+cost[j])
代码如下:
首先构造数组 dp[i][j]表示从i到j是回文串所花费的代价,因为添加一个字符和删除一个字符对于回文串是等价的,所以取二者代价更小的就行。len是字符串的长度。则dp的范围是第一层 i 从len-1到0,第二层是从i+1到len-1。这样当构造dp[i][j]为回文串时。只能从dp[i+1][j]和dp[i][j+1]入手,而二者变为回文串的代价已经知道了。所以递推式如下:
当str[i] == str[j]时:
dp[i][j]=dp[i+1][j−1]dp[i][j]=dp[i+1][j−1]
当stri] != str[j]时:
dp[i][j]=min(dp[i+1][j]+cost[i],dp[i][j−1]+cost[j])dp[i][j]=min(dp[i+1][j]+cost[i],dp[i][j−1]+cost[j])
代码如下:
#include<iostream> #include<string> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int MAX = 2010; const int INF = 0x3f3f3f3f; char str[MAX]; int cost[MAX],dp[MAX][MAX]; int N,M; void solve(){ memset(dp,0,sizeof(dp)); for(int i=M-1;i>=0;--i){ for(int j=i+1;j<M;++j){ dp[i][j] = INF;//开始时默认不是回文,所以把代价置为INF if(str[i] == str[j]) dp[i][j] = dp[i+1][j-1]; else dp[i][j] = min(dp[i+1][j]+cost[str[i]],dp[i][j-1]+cost[str[j]]); //此时dp[i+1][j],dp[i][j-1]都是已经构成回文的代价了. } } cout << dp[0][M-1] << endl; } int main(void){ cin >> N >> M; cin >> str; char ch; int add,del; for(int i=1;i<=N;++i){ cin >> ch >> add >> del; cost[ch] = min(add,del); } solve(); return 0; }
相关文章推荐
- poj 3280 Cheapest Palindrome(区间DP)[增删改变简单回文串]
- [区间dp 构建回文串] Cheapest Palindrome POJ - 3280
- poj 3280 Cheapest Palindrome(区间DP->字符串的增删价值最优)@
- poj 1854 贪心。。。(把一个字符串改成回文串的最小操作数)
- poj 3280 Cheapest Palindrome 区间dp
- poj 3280 区间dp
- poj 3280 Cheapest Palindrome(区间dp)
- POJ - 3280Cheapest Palindrome-经典区间DP
- (字符串的模式匹配4.7.18)POJ 2406 Power Strings(求一个字符串的最小重复串)
- poj 3280 Cheapest Palindrome(区间dp)
- poj 3280 Cheapest Palindrome(区间dp)
- poj 3042 区间dp(草的过期程度最小)
- Cheapest Palindrome POJ - 3280 (区间DP)
- 区间DP-合并石子(求最小/最代价 )
- POJ 3280 Cheapest Palindrome(区间DP)
- POJ1651 Multiplication Puzzle(相邻乘积之和最小,区间DP)
- uva 10453 回文串dp uva 10739 uva 11151最长回文串 poj 3280
- POJ 3280 Cheapest Palindrome(经典区间dp)
- POJ 3280 最小回文代价
- poj 3280 区间dp