计算多项式Poj(1996)

题目链接: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("
");    
    }

}
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/5705245.html