hdu4381Grid【微复杂的背包】

 拖了好久的题==从上周三没想完 到周四没状态 再到周末没学习==算是刷了将近一个月Dp专题的结尾吧 好难好难T^T

题意:一列有n个格子 m次操作可以将某段区间中x个格子涂成白的 问最后能有最多多少个白的==

真心没想到怎么能跟背包有关系@。@ 由于状态不好 ,看了好久题解才明白 由于题意中的区间一定是从两个端点开始的 ,那么利用这个性质,可以假定X的涂色的都是端点开始而且不间断的,多么多么像背包!那么怎么写呢?

首先,既然已经确定了是不间断的涂色,那么下标就可以直接反映出来有多少涂色的,dp数组反映出的就是需要操作次数~~对于第一问的涂色个数 就是两个数组的下标和了呗。第二问:Dp值和求最小值就好了嘛

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int maxn = 2005;
struct node{
    int aa,cor;
    node(){}
    node(int _aa,int _cor){
       aa = _aa;   cor = _cor;
    }
}x1[maxn],x2[maxn];
int n,m;
int dp1[maxn],dp2[maxn];
int sumx1,sumx2;

bool cmp(const node &p,const node &q){
    return p.aa < q.aa;
}

int min(int a,int b)
{
    return a<b?a:b;
}

int main()
{
    int cas,ta=1;
    scanf("%d",&cas);
    while(cas--){
         int i,j;
         scanf("%d%d",&n,&m);

         sumx1 = sumx2 = 1;
         for(i=0; i<m; i++){
             int key,yy,z;
             scanf("%d%d%d",&key,&yy,&z);
             if(key == 1){
                x1[sumx1++] = node(yy,z);
             }else{
                x2[sumx2++] = node(n+1-yy,z);
             }
         }
         sort(x1+1,x1+sumx1,cmp);
         sort(x2+1,x2+sumx2,cmp);
         memset(dp1,0x3f,sizeof(dp1));
         memset(dp2,0x3f,sizeof(dp2));

         dp1[0] = dp2[0] = 0;
         for(i=1; i<sumx1; i++){
             for(j=x1[i].aa; j>=x1[i].cor; j--){
                dp1[j] = min(dp1[j],dp1[j-x1[i].cor]+1);
             }
         }

         for(i=1; i<sumx2; i++){
             for(j=x2[i].aa; j>=x2[i].cor; j--){
                dp2[j] = min(dp2[j],dp2[j-x2[i].cor]+1);
             }
         }

         int ans = 0,anssum = 0,tmp;
         for(i=1; i<=n; i++){
            for(j=0; j<=i; j++){
               tmp = dp1[j] + dp2[i-j];
               if(tmp <= m){
                  if(ans != i){
                    ans = i;   anssum = tmp;
                  }else if(tmp < anssum){
                      anssum = tmp;
                  }
               }
            }
         }

         printf("Case %d: %d %d\n",ta++,ans,anssum);
    }
    return 0;
}

P。S。 经过了一个周末的休整,今天下午的状态还是没从休闲中缓过来T^T,感觉今天晚上应该能步入正轨。想起来周末临走前跟室友讨论到中学的话题,被室长评价说是童年因为初中和高中都没了,一方面也感谢中学严格教育带来的成绩,另一方面更感谢那种教育让我现在活得这么没脸没皮……这几天不知道怎么就总想到初中被英语老师当着全班同学面骂哭,因为初一一次集体活动(五一还是十一在防洪纪念塔的校庆晚会还是什么晚会,反正是要去做观众)本来白天和家人出去玩,不能按时回来,跟班主任请假,被呲:数学考7、8十分还好意思出去玩! 高中借给别人出门证(那人也是走读生),被发现,然后班主任在楼梯间冲我吼的全班在屋里都能听见……(⊙﹏⊙)b  反正上大学以后玻璃心是很少因为面子问题了,可能还是经常跟自己过不去吧,但是过去了就过去了。

现在比较担心的是明年春天能不能留下,明年秋天能不能顺利找到工作,本来还对江北抱有一丝希望,当作最后的退路(考研已经不可能了==)家里貌似真要是在江北就找人去事业单位T^T 可是还是好想好想去IT公司做前端开发啊T^T 虽然”我想“这件事并没有什么卵用,还是努力朝着自己选择的方向努力吧,上周上习近平讲话思想老师说大三就开始着手做简历,又联想到知乎上问:ACM区域赛铜牌有什么用(还是区域赛没得铜牌用什么用来着)最下面的回答我想给一万个赞:区域赛铜牌只有一行,可能就是好多人的大学四年……加油吧,还剩不到一年了亲爱的,不要只是把自己感动到,现在多努力一点、多辛苦一点,明年秋天就少受一个白眼、多一份offer

你可能感兴趣的:(算法,dp,HDU,杭电)