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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11385699.html
Copyright © 2011-2022 走看看