大数+简单dp 自己的思路不知为何老是Re 借鉴了别人的方法。。。确实自己在dp方面欠缺很多
#include <algorithm> #include <cstring> #include <cstdio> char dp[110][10010][110]; char s[10010],str[110]; void solve(char *s, char *str, char *s2) { //puts(str); //puts(s2); int a[110],b[110],c[110]; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); int len_1=strlen(str); int len_2=strlen(s2); int k=0; for(int i=len_1-1; i>=0; --i) { a[k++]=str[i]-'0'; //printf("::::%d\n",a[k-1]); } k=0; for(int j=len_2-1; j>=0; --j) b[k++]=s2[j]-'0'; k=0; for(int i=0; i<108; ++i) { c[i]=a[i]+b[i]+k; k=c[i]/10; c[i]%=10; } for(k=108; k>=0; --k) if(c[k]) break; if(k==-1) strcpy(s, "0"); else { int j=0; for(int i=k; i>=0; --i) s[j++]=c[i]+'0'; s[j]='\0'; //puts(s); } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s %s",s,str); memset(dp, 0, sizeof(dp)); int len_1=strlen(s),len_2=strlen(str); for(int i=0; i<=len_1; ++i) strcpy(dp[0][i],"1"); for(int i=1; i<=len_2; ++i) { for(int j=i; j<=len_1; ++j) { if(str[i-1]==s[j-1]) solve(dp[i][j],dp[i-1][j-1],dp[i][j-1]); else strcpy(dp[i][j],dp[i][j-1]); } } puts(dp[len_2][len_1]); } return 0; }