组队赛131005 Southwestern Europe Regional, SWERC 2010

H:这题dp得开三维的,开始我只开了二维,每次只能取某个区间的最小值,还得记录最后化成一个字符的那个字符,所以总共开三维。

代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
map<char,int>mp;
struct node
{
    int cost;
    char c;
}f[33][33];
char s[222];
int dp[222][222][33];
char C[33];
int main()
{
    int n,cas=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) break;
        mp.clear();
        for(int i=1;i<=n;i++)
        {
            char ch[11];
            scanf("%s",ch);
            mp[ch[0]]=i;
            C[i]=ch[0];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d-%c",&f[i][j].cost,&f[i][j].c);
            }
        }
        if(cas>1)
        {
            printf("\n");
        }
        cas++;
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",s);
            int L=strlen(s);
            memset(dp,-1,sizeof(dp));
            for(int i=0;i<L;i++)
            {
                dp[i][1][mp[s[i]]]=0;
            }
            for(int len=2;len<=L;len++)
            {
                for(int i=0;i+len-1<L;i++)
                {
                    int j=i+len-1;
                    for(int m=i;m<j;m++)
                    {
                        for(int c1=1;c1<=n;c1++)
                        {
                            if(dp[i][m-i+1][c1]==-1) continue;
                            for(int c2=1;c2<=n;c2++)
                            {
                                if(dp[m+1][j-m][c2]==-1) continue;
                                char fc=f[c1][c2].c;
                                int cos=f[c1][c2].cost;
                                if(dp[i][len][mp[fc]]==-1||dp[i][len][mp[fc]]>(cos+dp[i][m-i+1][c1]+dp[m+1][j-m][c2]))
                                {
                                    dp[i][len][mp[fc]]=cos+dp[i][m-i+1][c1]+dp[m+1][j-m][c2];
                                }
                            }
                        }
                    }
                }
            }
            int ansc,anscost=-1;
            for(int i=1;i<=n;i++)
            {
                if(anscost==-1||anscost<dp[0][L][i])
                {
                    anscost=dp[0][L][i];
                    ansc=i;
                }
            }
            printf("%d-%c\n",anscost,C[ansc]);
        }
    }
    return 0;
}


 

你可能感兴趣的:(组队赛131005 Southwestern Europe Regional, SWERC 2010)