• 计算多项式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
  • 相关阅读:
    一个来自红帽的Java垃圾回收算法,试图把停顿时间降到10毫秒以下 原创 2017-01-10 薛命灯
    Filter 配置多个URL-PATTERN
    页面接口防刷 解决思路一nginx
    数据库 原理解析
    程序员提高工作效率的15个技巧【Facebook】
    我总是记不住的那几个代码
    自适应开发
    文字换行
    CSS对字体单位的总结
    页面距离总结
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5705245.html
Copyright © 2020-2023  润新知