POJ3280 Cheapest Palindrome

DP
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<iomanip>
#include<set>
#include<string>
#include<iterator>
#define maxn 10000000
using namespace std;
int N,M;
int dp[2010][2010];
int cost[30];
string str;
void solve(){
    memset(dp,0,sizeof(dp));
    for(int i=M-1;i>=0;i--)//  倒着来
      for(int j=i;j<M;j++)
         if(str[i]==str[j])//****//
            dp[i][j]=dp[i+1][j-1];
         else
            dp[i][j]=min(dp[i+1][j]+cost[str[i]-'a'],dp[i][j-1]+cost[str[j]-'a']);

}
int main(){
    while(cin>>N>>M){

        cin>>str;
        char c;
        int a,b;
        for(int i=0;i<N;i++){
           cin>>c>>a>>b;
           cost[c-'a']=min(a,b);
        }
        solve();


       cout<<dp[0][M-1]<<endl;

    }





}

你可能感兴趣的:(动态规划)