题目链接:http://poj.org/problem?id=1996
思路:
刚开始打了个二维表,调了一个小时,爆内存了。
#include <stdio.h> #include <string.h> int a[105]; int y[105]; int ans[10005]; int dp[5005][5005]; int main() { int t; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(y,0,sizeof(y)); memset(ans,0,sizeof(ans)); memset(dp,0,sizeof(dp)); int m,n; scanf("%d%d",&m,&n); for(int i=0; i<=m; i++) { scanf("%d",&a[i]); if(i==0) ans[i] = a[i]; } for(int i=0; i<=n; i++) { scanf("%d",&y[i]); dp[1][i] = y[i]; } int pos=n; for(int i=0; i<=n; i++) printf("%d ",dp[1][i]); puts(""); for(int k=2; k<=m; k++) { for(int i=0; i<=n; i++) { for(int j=0; j<=pos; j++) { dp[k][i+j]+=dp[k-1][j]*y[i]; //printf("%d ",dp[k][i+j]); } } pos+=n; //for(int i=0; i<=pos; i++) //printf("%d ",dp[k][i]); //puts(""); } pos=n; for(int i=1; i<=m; i++) { for(int j=0; j<=pos; j++) { dp[i][j] = dp[i][j] * a[i]; //printf("%d ",dp[i][j]); } //puts(""); pos+=n; } for(int i=0; i<=n*m; i++) { for(int j=1; j<=m; j++) ans[i] +=dp[j][i]; } for(int i=0; i<=n*m-1; i++) printf("%d ",ans[i]); printf("%d",ans[n*m]); puts(""); } return 0; }
然后压缩了一下。
#include <stdio.h> #include <string.h> int a[105]; int b[105]; int dp[10005]; int ans[10005]; int tmp[10005]; int main() { int t; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); int m,n; scanf("%d%d",&m,&n); for(int i=0;i<=m;i++) scanf("%d",&a[i]); ans[0] = a[0]; for(int i=0;i<=n;i++) { scanf("%d",&b[i]); dp[i] = b[i]; } if(m!=0) { for(int i=0;i<=n;i++) ans[i] +=a[1]*dp[i]; } int pos = n; for(int k=2;k<=m;k++) { memset(tmp,0,sizeof(tmp)); for(int i=0;i<=n;i++) { for(int j=0;j<=pos;j++) tmp[i+j] +=b[i]*dp[j]; } pos+=n; for(int i=0;i<=pos;i++) dp[i] = tmp[i]; for(int i=0;i<=pos;i++) ans[i]+=a[k]*dp[i]; } for(int i=0;i<=pos-1;i++) printf("%d ",ans[i]); printf("%d ",ans[pos]); } return 0; }
现在还不知道WA在哪里。 打死POJ!!!
后来借鉴了帆哥的代码,一模一样的思路,就AC了。
要是哪个大神看出错了,记得@我啊!

#include<iostream> using namespace std; #define INF 10005 int x[INF],y[INF],z[INF],r[INF],p[INF]; int t; int n,m; int size; void calc(int k) { int i,j,h; if(k==0) { z[k]+=x[k]; size=0; } else if(k==1) { for(i=0;i<=m;i++) { z[i]+=(x[k]*y[i]); } size=m; } else { memset(p,0,sizeof(p)); for(j=0;j<=m;j++) { for(h=0;h<=size;h++) { p[j+h]+=(y[j]*r[h]); } } size+=m; for(j=0;j<=size;j++) { r[j]=p[j]; } for(i=0;i<=size;i++) { z[i]+=(r[i]*x[k]); } } } int main() { int i,j; scanf("%d",&t); while(t--) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(z,0,sizeof(z)); memset(r,0,sizeof(r)); memset(p,0,sizeof(p)); scanf("%d%d",&n,&m); for(i=0;i<=n;i++) { scanf("%d",&x[i]); } for(i=0;i<=m;i++) { scanf("%d",&y[i]); r[i]=y[i]; } for(i=0;i<=n;i++) { calc(i); } for(i=0;i<size;i++) { printf("%d ",z[i]); } printf("%d",z[size]); printf(" "); } }