Cheapest Palindrome.(POJ-3280)

经典DP。影响决策的是字符串的内容。而添加和删除字符本质上是一样的,我们不管选择哪一种都可以,所以只需要取两者中费用最小的。

状态转移方程就是:

if(s[i]==s[j]) dp[i][j] = dp[i+1][j-1];

else dp[i][j] = min(dp[i+1][j]+w[s[i]-‘a‘],dp[i][j-1]+w[s[j]-‘a‘]);

其中dpd[i][j]表示从字符串的i-j段为回文串时的最小值。

值得注意的是i需要反向枚举,j需要正向枚举,这是由状态转移的顺序决定的。因为dp[i][j]需要借用i+1时的结果和j+1时的结果。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,w[30],dp[2005][2005];
char s[2005];
int main() {
    scanf("%d%d",&n,&m);
    scanf("%s",s);
    char c = getchar();
    int a,b;
    for(int i=0;i<n;i++) {
        c = getchar();
        scanf("%d%d",&a,&b);

        int d = min(a,b);
        w[c-'a'] = d;
        c = getchar();
    }
    for(int i=m-1;i>=0;i--)
    for(int j=i+1;j<m;j++) {
        if(s[i]==s[j]) dp[i][j] = dp[i+1][j-1];
        else dp[i][j] = min(dp[i+1][j]+w[s[i]-'a'],dp[i][j-1]+w[s[j]-'a']);
    }
    printf("%d\n",dp[0][m-1]);
    return 0;
}
时间: 2024-08-09 14:44:30

Cheapest Palindrome.(POJ-3280)的相关文章

POJ 3280 Cheapest Palindrome(区间DP)

 Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6894   Accepted: 3344 Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each co

【POJ】3280 Cheapest Palindrome(区间dp)

Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10943   Accepted: 5232 Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow

Cheapest Palindrome(区间DP)

描述 Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow an electronic ID tag that the system will read as the cows pass by a scanner. Each ID tag's contents are currentl

POJ 3280 Cheapest Palindrome(DP)

题目链接 题意 :给你一个字符串,让你删除或添加某些字母让这个字符串变成回文串,删除或添加某个字母要付出相应的代价,问你变成回文所需要的最小的代价是多少. 思路 :DP[i][j]代表的是 i 到 j 这一段位置变成回文所需的最小的代价. 1 //3280 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 6 using namespace std ; 7 8 char sh[2100]

HDU 1325 Is It A Tree? (POJ 1308)

并查集问题... 这题以前做过-- 以前做过-- 做过-- 过-- 不过重做时候被吭得异常之爽-- 在判断 vis[i]的时候.我记得标准C++是非0 即为真. 而我用C++ 提交的时候 if(vis[i]) 去直接给我WA了. 用G++ 就AC了...然后改成if(vis[i]==1) 交C++ 就AC了. 特瞄的我每次初始化都把 vis[i] 都赋值为 0 了..都能出这种错? 求路过大神明示我的错误. 题意是判断是否是一棵树. 不能存在森林,用并查集合并,每个点的入度不能超过1. 比如 1

HDU 1535 Invitation Cards (POJ 1511)

两次SPFA.求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换,但是这个有1000000个点,矩阵开不了. d1[]为 1~N 的最短路. 将所有边的 邻点 交换. d2[] 为 1~N 的最短路. 所有相加为 所要答案. 忧伤的是用SPFA  "HDU 1535"  AC了,但是POJ 一样的题 "POJ 1511" 就WA了. 然后强迫症犯了,不停的去测试. 题意中找到一句关键话 :Prices are positive integ

每日一dp(1)——Largest Rectangle in a Histogram(poj 2559)使用单调队列优化

Largest Rectangle in a Histogram 题目大意: 有数个宽为1,长不定的连续方格,求构成的矩形中最大面积 /************************************************************************/ /* 思路1. 当前为n的面积如何与n-1相联系,dp[i][j]=max(dp[i-1][k]) , 0<k<=j 描述:i为方块个数,j为高度 但是此题目的数据对于高度太变态,h,1000000000 ,n,1

uva11151Longest Palindrome(递推)

题目;uva11151Longest Palindrome(递推) 题目大意:给出一个字符串,问它可以通过去掉些字符得到的最长的回文的长度. 解题思路:dp[i][j]代表从字符串i位到j位最长的回文的长度. 如果s[i] == s[j] , dp[i][j] = dp[i - 1][j - 1] + 2: 因为头尾相同,那么要求i到j的最长的回文的话,只有可能是中间的部分最长的回文加上2. 否则dp[i][j] = Max (dp[i][j - 1], dp[i + 1][j]): 计算顺序:

uva10739String to Palindrome(递推)

题目:String to Palindrome 题目大意:给出一字符串,给你三种操作:可以将任何位置的字符删除,可以将任何位置的字符替换,可以在任何位置插入一个字符.问最少的操作能够把这个字符转换成回文. 解题思路:dp[i][j]代表使字符串i到j位的子串变成回文的最少的操作.替换和删除还算好做,一开始一点都不知道插入该怎么办,后来看了别人的题解发现删除和插入是一样的效果.例如对于abbb字符串中的位置(1234)这个串,如果删除最后的那个b,那么就是dp[1][3] + 1.如果是在a的前面

Power string(poj 2406)

题目大意,给出一个字符串s,求最大的k,使得s能表示成a^k的形式,如 abab 可以表示成(ab)^2: 方法:首先 先求kmp算法求出next数组:如果 len mod (len-next[len])==0 ,答案就是 len /(len-next[len]),否则答案是1:证明如下: 如果s能表示成 a^k的形式且k>1,k尽可能大,即s可以表示成aaaaaa(k个a):那么next[len]就等于k-1个a的长度:aaaaaaa  aaaaaaa那么 (len-next[len])a的长