小米oj 6. 交叉佇列
阿新 • • 發佈:2019-01-07
dp【i】【j】的狀態為true表示兩種情況:
1,s1的 i 號位等於s3的(i+j)號位 且 dp【i-1】【j】為true
2,s2的 j 號位等於s3的(i+j)號位 且 dp【i】【j-1】為true
#include<bits/stdc++.h> using namespace std; const int maxn=1005; char a[maxn],b[maxn],c[maxn],lin[maxn]; void handle(){ int i=0,j=0; for(i=0;;i++){ if(lin[i]==','){a[i]='\0';break;} a[i]=lin[i]; } i++; for(j=0;;j++){ if(lin[i]==','){b[j]='\0';break;} b[j]=lin[i]; i++; } i++; for(j=0;;j++){ if(i==strlen(lin)){c[j]='\0';break;} c[j]=lin[i]; i++; } return; } int main(){ while(cin>>lin){ handle(); //cout<<a<<" "<<b<<" "<<c<<endl; bool mark; int l1=strlen(a),l2=strlen(b),l3=strlen(c); if(l1+l2!=l3)mark=false; else if(l1==0){ if(strcmp(b,c)==0)mark=true; else mark=false; } else if(l2==0){ if(strcmp(a,c)==0)mark=true; else mark=false; } else{ int dp[l1+1][l2+1]; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=l1;i++)if(a[i-1]==c[i-1])dp[i][0]=dp[i-1][0]; for(int i=1;i<=l2;i++)if(b[i-1]==c[i-1])dp[0][i]=dp[0][i-1]; for(int i=1;i<=l1;i++){ for(int j=1;j<=l2;j++){ int k=i+j; if(a[i-1]==c[k-1])dp[i][j]= dp[i-1][j] | dp[i][j]; if(b[j-1]==c[k-1])dp[i][j]= dp[i][j-1] | dp[i][j]; } } if(dp[l1][l2]==1)mark=true; else mark=false; } if(mark==true)cout<<"true"<<endl; else cout<<"false"<<endl; } return 0; }