查看: 1571|回復: 0
打印 上一主題 下一主題

[ZJ] b232 - TOI2009 第四題:分房子

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-5-18 21:53:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    原題:http://zerojudge.tw/ShowProblem?problemid=b232
    AC:http://zerojudge.tw/Submissions? ... mp;account=lfs92002

    本題DP+大數。大數隨便抓個以前的模板就解決了。我都忘記我怎麼DP了,這是一年前寫的CODE,沒什麼印象,不過看起來就是背包。


    /**********************************************************************************/
    /*  Problem: b232 "TOI2009 第四題:分房子" from 2009 TOI 研習營初選   */
    /*  Language: CPP (2389 Bytes)                                                    */
    /*  Result: AC(0.3s, 161.7MB) judge by this@ZeroJudge                             */
    /*  Author: lfs92002 at 2013-02-25 14:17:42                                       */
    /**********************************************************************************/


    #include<cstdio>
    #include<string.h>
    #include<iostream>
    using namespace std;

    class bigNum{
        int tmp[50];
        public:
            char data[50];
            char p[50];
            bigNum()
            {
                int t=0;
                while(t<50)data[t++]='\0';
            }
            bigNum& operator=(int num)
            {
                int t=0;
                while(num)
                {
                    data[t]=num%10+'0';
                    t++;
                    num/=10;
                }
                while(t<50)data[t++]='\0';
                return *this;
            }
            bigNum operator+(const bigNum &a)
            {
                bigNum g;
                for(int i=0;i<50;i++)
                {
                    g.tmp[i]=0;
                    if(data[i]>'0')g.tmp[i]+=data[i]-'0';
                    if(a.data[i]>'0')g.tmp[i]+=a.data[i]-'0';
                }
                for(int i=0;i<50-1;i++)
                {
                    if(g.tmp[i]>9)
                    {
                        g.tmp[i+1]+=g.tmp[i]/10;
                        g.tmp[i]%=10;
                    }
                    g.data[i]='0'+g.tmp[i];
                }
                int t=50-1;
                while(g.data[t]=='0')g.data[t--]='\0';
                return bigNum(g);
            }
            char * print()
            {
                memset(p,0,sizeof(p));
                int L=strlen(data)-1,d=0;
                while( L>=0 &&data[L]=='0') L--;
                while( L>=0 ) p[d++]=data[L--];
                return p;
            }
            
    };

    bigNum dp[751][751];
    int main()
    {
        memset(dp,0,sizeof(dp));
        dp[0][0]=dp[0][0]=1;
        int N,T,i_line,D;
        while(~scanf("%d",&T))
        {
            while(T--)
            {
                scanf("%d",&N);
                i_line=(N+1)/2;
                for(int i=1;i<=i_line;i++)
                {
                    for(int j=0;j<=N;j++)
                    {
                        D=i*2-1;
                        if(D>j)
                        {
                            dp[i][j]=dp[i-1][j];
                        }
                        else
                        {
                            dp[i][j]=dp[i-1][j]+dp[i][j-D];
                        }
                    }
                }
                printf("%s\n",dp[i_line][N].print());
            }
        }
    }


    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表