NYOJ 1023 还是回文

#include<stdio.h>
#include<string.h>
#define N 2100
#define Min(a,b) (a<b?a:b)
using namespace std;
int cost[26],dp[N][N];
char str[N];
int main()
{
  int i,j,n,m,a,b;
  char s[2];
  while(~scanf("%d%d",&n,&m))
  {
    scanf("%s",str);
    for(i=0;i<n;i++)
    {
      scanf("%s%d%d",s,&a,&b);
      cost[s[0]-‘a‘]=Min(a,b);//两者选较小的作为花费
    }
    for(j=1;j<m;j++)
    {
      for(i=j-1;i>=0;i--)
      {
        //找每一个由小到大的区间,选最小花费的
        dp[i][j]=Min(dp[i+1][j]+cost[str[i]-‘a‘],dp[i][j-1]+cost[str[j]-‘a‘]);
        // 如果已经匹配就不用加上花费
        if(str[i]==str[j])
          dp[i][j]=Min(dp[i+1][j-1],dp[i][j]);
      }
    }
    printf("%d\n",dp[0][m-1]);
    memset(dp,0,sizeof(dp));
  }
}

时间: 2024-10-11 16:06:55

NYOJ 1023 还是回文的相关文章

NYOJ 1023 还是回文(DP,花最少费用形成回文串)

1 /* 2 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 3 那么,将字符串变成回文串的最小花费是多少呢? 4 5 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字符串中删除这个字符 x 6 同样也能形成回文串! 7 所以我们只记录删除,和增加这个字符 x 的最小的费用就好了!->转变成添加多少个字符形成回文串费用最少! 8 9 str[i]!=str[k] 10 dp[i][j]=min(dp[i][j-1]+cost[str[k]-'a

nyoj 题目37 回文字符串

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数

Manacher算法 , 实例 详解 . NYOJ 最长回文

Manacher 算法 定义数组 p[i]表示以i为中心

nyoj 37回文串

述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数 dp[i][j]=dp[i+1][j] s[i]==s[j]            

NYOJ 752 又见回文串

又见回文串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.今天,PIAOYI又遇见一个关于字符串的题:两人玩一个游戏,给一个字符串,两人轮流删除字符串中的任意一个字符,当某人删除字符后,若该字符串可以经过重新整理后是一个回文串,则他获胜.当两人足够聪明均不出现操作失误的情况,先手是否可以获胜. 输入 多组测试数据,输入一个字符串(所有字

nyoj 回文字符串(LCS)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

nyoj 781 又见回文数

又见回文数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 冷淡的回文数被水了,各种被水,然后他很生气,然后... 一个数从左边读和从右边读一样,就说这个数是回文数.如121就是一个回文数. 这个简单了点,咱们这样规定:给定一个十进制数,你判断一下在二~十六进制下她是否是回文数,你能征服她吗? 如17用十进制表示它不是回文数,但是用二进制表示(10001),它是一个回文数. 输入 输入包含一些整数.每个数n(0<n<50000)用十进制表示,每个数一行.输入0结束

nyoj 回文字符串

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数

nyoj 还是回文

还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费.那么,将字符串变成回文串的最小花费是多少呢? 输入 多组数据 第一个有两个数n,m,分别表示字符的种数和字符串的长度 第二行给出一串字符,接下来n行,每行有一个字符(a~z)和两个整数,分别表示添加和删除这个字符的花费 所有数都不超过2000 输出 最小花费 样例输入 3 4 a