poj 1732
dp
代码:
#include<iostream> #include<fstream> using namespace std; int dp[101]; char c[110]; char hash[30]="22233344115566070778889990"; int road[101]; int n; char a[50001][51]; char b[50001][51]; void print(int s){ if(s!=0) { print(s-strlen(a[road[s]])); cout<<b[road[s]]<<' '; } } void read(){ // ifstream cin("in.txt"); int i,j,k; while(cin>>c){ cin>>n; for(i=1;i<=n;i++) { cin>>b[i]; for(j=0;j<strlen(b[i]);j++) a[i][j]=hash[b[i][j]-'a']; a[i][strlen(b[i])]='\0'; } for(i=1;i<=strlen(c);i++) dp[i]=strlen(c)+1; dp[0]=0; for(i=1;i<=strlen(c);i++) for(j=1;j<=n;j++) if(i>=strlen(a[j])&&strncmp(&c[i-strlen(a[j])],a[j],strlen(a[j]))==0) { if(dp[i]>dp[i-strlen(a[j])]+1) { dp[i]=dp[i-strlen(a[j])]+1; road[i]=j; } } if(dp[strlen(c)]==strlen(c)+1) cout<<"No solution."<<endl; else { print(strlen(c)); cout<<endl; } } } int main(){ read(); return 0; }