• <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 閱讀(1049) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            激情综合色综合久久综合| 激情综合色综合久久综合| 久久伊人影视| 久久久久国产精品人妻| av色综合久久天堂av色综合在| 亚洲午夜久久久久久久久电影网| 人妻少妇久久中文字幕一区二区 | 亚洲国产另类久久久精品| 国产精品久久久久AV福利动漫| 久久综合狠狠综合久久激情 | 色婷婷狠狠久久综合五月| 亚洲精品无码专区久久久| a高清免费毛片久久| 少妇无套内谢久久久久| 大香网伊人久久综合网2020| 97久久久久人妻精品专区| 四虎影视久久久免费观看| 国产精品9999久久久久| 中文精品久久久久人妻| 久久夜色精品国产www| 99精品国产在热久久无毒不卡| 亚洲欧美国产日韩综合久久| 国产69精品久久久久777| 狠狠色婷婷久久综合频道日韩| 久久精品国产精品亚洲人人| 亚洲国产成人久久精品动漫| 天天爽天天狠久久久综合麻豆| 开心久久婷婷综合中文字幕| 91精品日韩人妻无码久久不卡 | 久久一日本道色综合久久| 一本色道久久88综合日韩精品 | 综合久久一区二区三区 | 93精91精品国产综合久久香蕉| 无码专区久久综合久中文字幕| 2021国内久久精品| 国产精品乱码久久久久久软件| 久久精品二区| 亚洲精品国产综合久久一线| 无码人妻少妇久久中文字幕 | 欧美亚洲国产精品久久高清| 久久乐国产精品亚洲综合|