hdu1501 动态规划

这题有两种解题思路,一个是记忆化搜索,一个是dp。

分别贴代码:

记忆化搜索:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
char str[1000],a[300],b[300];
int sum,flag;
int hash[205][205];
void dfs(int i,int j,int k)
{
    if(flag)
        return ;
    if(k==sum)
    {
        flag=1;
        return ;
    }
    if(hash[i][j])
        return ;
    hash[i][j]=1;
    if(a[i]==str[k])
        dfs(i+1,j,k+1);
    if(b[j]==str[k])
        dfs(i,j+1,k+1);
}
int main()
{
    int i,j,t,Case=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s %s %s",&a,&b,&str);
        sum=strlen(str);
        flag=0;
        memset(hash,0,sizeof(hash));
        dfs(0,0,0);
        if(flag)
            printf("Data set %d: yes
",Case++);
        else
            printf("Data set %d: no
",Case++);
    }
    return 0;
}

dp:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[205][205];
int main()
{
    int i,j,l1,l2,sum,t,Case=1;
    char a[205],b[205],str[405];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%s%s",&a,&b,&str);
        l1=strlen(a);
        l2=strlen(b);
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(i=0;i<=l1;i++)
            for(j=0;j<=l2;j++)
            {
                if(i>0&&a[i-1]==str[i+j-1]&&dp[i-1][j])
                    dp[i][j]=1;
                if(j>0&&b[j-1]==str[i+j-1]&&dp[i][j-1])
                    dp[i][j]=1;
            }
        if(dp[l1][l2])
            printf("Data set %d: yes
",Case++);
        else
            printf("Data set %d: no
",Case++);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wangfang20/p/3177979.html