• POJ 3280 Cheapest Palindrome(区间dp)


    思路:

    定义dp[i][j]为将ij位置的字符串转换为回文串,我们从小到大放大这个区间,定义w[c-'a']为字母c的花费,可得
    dp[i][j]={dp[i+1][j1]s[i]==s[j]min(dp[i+1][j]+w[s[i]a],dp[i][j1]+w[s[j]a])s[i]!=s[j]dp[i][j]= egin{cases} dp[i+1][j-1]& ext{s[i]==s[j]}\ min(dp[i+1][j]+w[s[i]-'a'],dp[i][j-1]+w[s[j]-'a'])& ext{s[i]!=s[j]} end{cases}

    代码:

    #include<iostream>
    #include<cctype>
    #include<cstring>
    #include<string> 
    #include<algorithm>
    using namespace std;
    const int N=26;
    const int MAX_M=2005;
    int n,m,w[N],dp[MAX_M][MAX_M];  //dp[i][j]:the min cost to make the substring which from i to j legal 
    string s;
    void solve(){
    	for(int i=m-2;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];
    }
    int main(){
    	cin>>n>>m>>s;
    	for(int i=0;i<n;i++){
    		char c;
    		int w1,w2;
    		do{c=getchar();}while(!isalpha(c));
    		cin>>w1>>w2;
    		w[c-'a']=min(w1,w2);
    	}
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    NOIP提高组2004 合并果子题解
    RMQ问题之ST算法
    7.18考试
    7.18
    7.17
    7.16
    7.15
    7.14
    7.13考试
    7.13
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308787.html
Copyright © 2020-2023  润新知