首页 > 代码库 > HDU 1243 DP

HDU 1243 DP

思路和1080一样

题目有几个坑:

范围要开到2010,题目没有给

子弹数量和恐怖分子出现的字符串长度不一定相等

用memset会超时



#include "stdio.h"
#include "string.h"

int dp[2010][2010],a[2010];

int Max(int a,int b,int c)
{
    int x;
    x=a;
    if (b>x) x=b;
    if (c>x) x=c;
    return x;
}
int main()
{
    int n,i,j,x,y,z,len_a,len_b;
    char key[2010],str_a[2010],str_b[2010];
    while (scanf("%d",&n)!=EOF)
    {
        scanf("%s",key);
        for (i=0;i<n;i++)
            scanf("%d",&a[key[i]]);

        scanf("%s %s",str_a,str_b);
        len_a=strlen(str_a);
        len_b=strlen(str_b);

        for (i=1;i<=n;i++)
        dp[0][i]=dp[i][0]=0;
        dp[0][0]=0;

        for (i=1;i<=len_a;i++)
            for (j=1;j<=len_b;j++)
            {
                x=dp[i-1][j];
                y=dp[i][j-1];
                z=dp[i-1][j-1];
                if (str_a[i-1]==str_b[j-1])
                    z+=a[str_a[i-1]];
                dp[i][j]=Max(x,y,z);
            }
        printf("%d\n",dp[len_a][len_b]);
    }
    return 0;

}



HDU 1243 DP