• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Onway

            我是一只菜菜菜菜鳥...
            posts - 61, comments - 56, trackbacks - 0, articles - 34

            pku 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS

            Posted on 2010-07-29 11:07 Onway 閱讀(491) 評論(0)  編輯 收藏 引用 所屬分類: 傷不起的ACM

            pku 1221   UNIMODAL PALINDROMIC DECOMPOSITIONS
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1221
            題意:給定一個n,求串里元素之和為n的數字回文串的個數。

            這個題目想了我很久,看著所有討論都說是簡單題,想死的心都有。
            最后自己還是想不出來,看了人家的DP狀態設計才寫出來了。

            剛開始,總是往一維DP(其實不算DP吧,都沒有狀態轉移的,只是簡單的遞推而已)里想,
            還想出了其他一些結論,只是還不至于能解出這個題,說白了就是,還是沒想到。
            以下的內容都是參考了網上已經擺放了N久的題解,加上了自己的理解而已。

            假設dp[i][j]為:將i這一個數拆分為串里元素均不少于j的回文串的總個數。
            對于這種狀態設計的理解很重要,至少要理解里面的兩個意思:
            1,串里元素均不少于j,也就是這些回文串最外面的兩個數至少為j。
            2,當j=1時,dp[i][j]即表示,元素之和為i的回文串的總個數,因為元素至少都要為1。
             很明顯,dp[i][1]包含了dp[i][2],dp[i][2]又包含了dp[i][3]……。


            然后對于dp[i][j],再分兩層理解來設計轉移方程:
            1,當最外面的兩個元素為j的時候,這兩個元素之間的其他元素之和就為i-2*j。
             dp[i-2*j][j]里的所有個數只要往兩邊加上j就變成了dp[i][j]的一部分解。
            2,當最外面的兩個元素大于j的時候,只要將dp[i][j]加上dp[i][j+1]即可。
             因為dp[i][j+1]包含了dp[i][j+2]。

            所以DP方程可以設計為下:

            dp[i][j]=dp[i][j+1]+dp[i-2*j][j];

            然后是處理這個方程的邊界條件。j<=i,當j==i的時候,dp[i][j]==1;

            當i-2*j<0的時候,即代表i不能拆分,應直接加0
            當i-2*j==0的時候,這時該這么理解,i可以拆分為最外兩個元素為j,中間元素為0
            即不存在中間元素,這時的回文串只有一個,即(j,j)。所以dp[0][j]應初始化為1

             1#include <iostream>
             2using namespace std;
             3__int64 dp[301][301];  //假設了數組最大的輸入為300。
             4int main()
             5{
             6    int i,j;
             7    for(i=1;i<=300;++i)  //初始化,詳細見上。
             8    {
             9        dp[0][i]=1;    
            10        dp[i][i]=1;
            11    }

            12    for(i=2;i<=300;++i)
            13        for(j=i-1;j>=1;--j)
            14        {
            15            dp[i][j]=dp[i][j+1]+(i>=2*j?dp[i-2*j][j]:0);
            16            //如果不對i-2*j進行判斷,會導致數組訪問下溢
            17        }

            18    int n;
            19    while(scanf("%d",&n)!=EOF&&n)
            20    {
            21        printf("%d %I64d\n",n,dp[n][1]);
            22    }

            23    return 0;
            24}

            25
            国产V亚洲V天堂无码久久久| 久久久久AV综合网成人| 精品综合久久久久久88小说| 久久综合给合综合久久| 亚洲色婷婷综合久久| 久久精品国产99国产精偷| 一本色道久久88综合日韩精品| 久久亚洲日韩精品一区二区三区| 亚洲天堂久久精品| 亚洲午夜久久久久久噜噜噜| 国产亚洲美女精品久久久| 无码人妻久久一区二区三区免费丨 | 97久久综合精品久久久综合| 激情综合色综合久久综合| 久久久久精品国产亚洲AV无码| 久久国产乱子精品免费女| 亚洲欧美伊人久久综合一区二区| 国产亚洲美女精品久久久| 久久被窝电影亚洲爽爽爽| 无码久久精品国产亚洲Av影片| 久久久久久A亚洲欧洲AV冫| 精品一区二区久久| 国产精品美女久久久久| 久久久一本精品99久久精品88| 久久久精品无码专区不卡| 久久国产乱子伦精品免费强| 精品乱码久久久久久久| 久久久久久精品成人免费图片| 色悠久久久久久久综合网 | 亚洲国产香蕉人人爽成AV片久久| 亚洲国产精品热久久| 国产精品无码久久综合| 久久婷婷国产综合精品 | 国产精品久久久久久福利漫画| 婷婷久久久亚洲欧洲日产国码AV| 亚洲精品美女久久久久99小说| 亚洲乱码日产精品a级毛片久久 | 国内精品九九久久精品| 国产成人综合久久精品红| 麻豆精品久久久久久久99蜜桃| 伊人 久久 精品|