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\n",Case++); else printf("Data set %d: no\n",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\n",Case++); else printf("Data set %d: no\n",Case++); } return 0; }