• <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>

            Why so serious? --[NKU]schindlerlee

            2009年12月8日星期二.sgu482 貌似是目前唯一一個解題報告

            2009年12月8日星期二.sgu482

            sgu482:dp
            題目解釋:n個木條,高h[1...n],要求拿走盡量多的木條,同時保證此時剩下的所有木條的周長
            不小于原來的一半
            從反面思考,題目要求求能拿走的最大面積,按照周長dp沒有辦法。搜是肯定不行的,可以按照
            面積dp,面積最大才5000。
            我們可以求出每個面積的最大周長,遍歷一下找符合條件的最小面積,然后用原面積減這個面積
            即是所求。

            現在考慮求周長的問題
             
            如果后一個比上一個短 周長 += 2 ;
            |
            | |
            | |

            如果后一個比上一個長 周長 += 2 + 2 * abs(h[i]-h[i-1]);
              |
            | |
            | |

            但是如果按照如上的思路,肯定會寫出一個2維dp,例如

            area[i] 表示面積為i時的最大周長
             1 
             2 for(i = 1;i <= n;i++) {
             3     for(s = h[i];s <= 5000;s++) {
             4         if(area[s-h[i]] >= 0 ) {
             5             if (area[s] < area[s-h[i]] + cacu(h[i],last[s-h[i]])) {
             6                 area[s] = area[s-h[i]] + cacu(h[i],last[s-h[i]]));
             7                 last[s] = h[i];
             8             }
             9         }
            10     }
            11 }


            但是這樣寫是錯的.... 我一開始就是這么寫的 WA at test case 13
            ∵ 當前面積的<<<更大周長并不能保證更大面積得到更好的解>>>,周長只和高度的差有關
              <<<也就是二維dp并不具有最優子結構>>>

            ∴ 要寫成三維dp
            dp[i][j]表示面積為i時使用前j個木條的周長最大值
            如下方法能求出最優解
             1 for(i = 1;i <= n;i++) {
             2     for(s = h[i];s < N;s++) {
             3         for(j = i - 1;j >= 0;j --) {
             4             if(dp[s-h[i]][j] >= 0) {
             5                 if (dp[s][i] < dp[s-h[i]][j] + cacu(h[i],h[j])) {
             6                     dp[s][i] = dp[s-h[i]][j] + cacu(h[i],h[j]);
             7                 }
             8             }
             9         }
            10     }
            11 }


            ==========貼代碼====================華麗麗的分割線====================
             1 /*
             2  * SOUR:sug482
             3  * ALGO:dp
             4  * DATE: 2009年 12月 05日 星期六 13:19:59 CST
             5  * COMM:3~4
             6  * 從反面思考
             7  * */
             8 #include<iostream>
             9 #include<cstdio>
            10 #include<cstdlib>
            11 #include<cstring>
            12 #include<algorithm>
            13 using namespace std;
            14 typedef long long LL;
            15 const int maxint = 0x7fffffff;
            16 const long long max64 = 0x7fffffffffffffffll;
            17 const int N = 5010;
            18 const int inf = 1 << 28;
            19 int n;
            20 int dp[N][128],pre[N][128][2],h[N],perimeter,area,res,out[N],top,vis[128];
            21 int cacu(int h, int last) { return h-last+abs(h-last)+2; }
            22 
            23 int main()
            24 {
            25     int i,j,k,s,x,y;
            26     scanf("%d",&n);
            27     h[0= 0,perimeter = 0,area = 0,res = 0;
            28     for(i = 1;i <= n;i++) {
            29         scanf("%d",h + i);
            30         perimeter += cacu(h[i],h[i-1]);
            31         area += h[i];
            32     }
            33     for(i = 0;i < N;i++) {dp[0][i] = 0;}
            34     for(i = 1;i < N;i++) {
            35         for(j = 0;j < N;j++) {
            36             dp[i][j] = -1;
            37         }
            38     }
            39     for(i = 1;i <= n;i++) {
            40         for(s = h[i];s < N;s++) {
            41             for(j = i - 1;j >= 0;j --) {
            42                 if(dp[s-h[i]][j] >= 0) {
            43                     if (dp[s][i] < dp[s-h[i]][j] + cacu(h[i],h[j])) {
            44                         dp[s][i] = dp[s-h[i]][j] + cacu(h[i],h[j]);
            45                         pre[s][i][0= s - h[i];
            46                         pre[s][i][1= j;
            47                     }
            48                 }
            49             }
            50             if(dp[s][i] + dp[s][i] >= perimeter) {
            51                 if (res < area - s) {
            52                     res = area - s;
            53                     x = s,y = i;
            54                 }
            55             }
            56         }
            57     }
            58     printf("%d\n",res);
            59     if(res > 0) {
            60         while(x != 0 && y != 0) {
            61             vis[y] = 1;
            62             int tx = pre[x][y][0];
            63             int ty = pre[x][y][1];
            64             x = tx,y = ty;
            65         }
            66         for(i = 1;i <= n;i++) {
            67             if(!vis[i]) {
            68                 out[top++= i;
            69             }
            70         }
            71     }
            72     printf("%d\n",top);
            73     if(top > 0)
            74         printf("%d",out[0]);
            75     for(i = 1;i < top;i++) {
            76         printf(" %d",out[i]);
            77     }
            78     if(top > 0)
            79         putchar(10);
            80     return 0;
            81 }
            82 


            posted on 2009-12-08 21:31 schindlerlee 閱讀(1044) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            国产一区二区精品久久凹凸| 欧美色综合久久久久久| 久久久精品视频免费观看| 国产成人精品久久免费动漫| 久久久久精品国产亚洲AV无码| 久久精品无码专区免费| 久久精品无码一区二区三区日韩| 久久er热视频在这里精品| 久久99国产精品久久99| 久久国产高清字幕中文| 日韩欧美亚洲综合久久影院d3| 久久久久亚洲AV无码永不| 精品永久久福利一区二区| 国产精品美女久久久久久2018| 久久婷婷五月综合色奶水99啪| 久久精品国产亚洲AV无码偷窥| 久久人爽人人爽人人片AV| 国产精品久久久久影院嫩草| 国产精品久久久久影视不卡| 国产精品99久久久久久猫咪 | 亚洲精品WWW久久久久久| 亚洲中文字幕伊人久久无码| 久久毛片一区二区| 久久国产精品77777| 91精品国产91热久久久久福利| 久久久久久毛片免费看| 亚洲女久久久噜噜噜熟女| 97久久久精品综合88久久| 狠狠色伊人久久精品综合网| 久久天天躁狠狠躁夜夜不卡| 成人久久久观看免费毛片| 久久精品国产精品亚洲下载 | 99久久免费国产精品特黄| 69久久夜色精品国产69 | 欧洲国产伦久久久久久久| 人妻无码中文久久久久专区| 国产精品伊人久久伊人电影 | 精品久久国产一区二区三区香蕉| 99久久这里只精品国产免费| 日本道色综合久久影院| 亚洲色欲久久久综合网|