zoukankan      html  css  js  c++  java
  • poj3280Cheapest Palindrome

    给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符Add与Delete的代价,求将S变为回文串的最小代价和。

    Input
    第一行:两个由空格分隔的整数 N 和 M

    第二行:这一行给出了恰好 M 个字符,表示初始状态下的ID字符串

    接下来的 N 行:每一行给出了由空格分隔的三部分。首先是一个字符,保证出现在了输入的字符串中。接下来是两个整数,表示你增添这个字符的代价,然后是删除这个字符的代价

    Output
    你只需要输出一行,且只输出一个整数。表示你将给定字符串变成回文串所需的最小代价。

    Sample Input
    3 4
    abcb
    a 1000 1100
    b 350 700
    c 200 800
    Sample Output
    900

    dp[i][j]表示使区间[i,j]变为回文串所要耗费的最少能量。

    include

    using namespace std;
    int dp[2005][2005],w[130]; //这里之前写进main()函数,提交一直显示runtime error,听人说貌似数组开的大的话,一般都是开在全局变量。
    int main()
    {
    int n,m,a,b;
    char s[2100],ch;
    while(cin>>n>>m)
    {
    // getchar();
    cin>>s;

    	for(int i=0;i<n;i++)
    	{
    		cin>>ch>>a>>b;
    		w[ch-'a']=min(a,b);
    	}
    	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']);
    		}
    	}
    	cout<<dp[0][m-1]<<endl;
    }
    return 0;
    

    }


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11385699.html
Copyright © 2011-2022 走看看