zoukankan      html  css  js  c++  java
  • [Shoi2007]Bookcase 书柜的尺寸 dp

    这道dp算是同类型dp中比较难的了,主要难点在于设置状态上;

    如果像平时那样设置,必定爆空间没商量;

    下面是一种思路:

    先把输入进来的数据按h从大到小排序,这样就可以大大减少状态数,

    然后设f[i][j][k]为前i本书第一个书柜厚度j,第二个书柜厚度k,第三个书柜厚度sum[i]-j-k的h最大值得最小和;

    这样一是将h放在了里面,相当于一个方程思想,因为s可以由h,t算出来;

    二是转移的时候,如果j,k或sum[i]-j-k为0,直接加上h,因为前面的h比后面的大,方便了转移;

    但我最后也是心惊胆战的交了上去,幸运地A了;

    这种题还是做的太少了,加油吧;

    自己都不忍直视的代码->

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<ctime>
     5 #include<cstring>
     6 #include<string>
     7 #include<algorithm>
     8 #include<map>
     9 #include<set>
    10 using namespace std;
    11 #define LL long long
    12 const long long inf=1000000000LL;
    13 int n,c=0;
    14 struct node{
    15     int h,t;
    16     bool operator<(const node& b)const{return h>b.h;}
    17 }e[72];
    18 LL f[2110][2110],sum[72];
    19 void init(){
    20     scanf("%d",&n);
    21     for(int i=1;i<=n;i++){scanf("%d%d",&e[i].h,&e[i].t);c+=e[i].t;}
    22     sort(e+1,e+n+1);
    23     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+e[i].t;
    24 }
    25 void work(){
    26     memset(f,10,sizeof(f));
    27     f[0][0]=0;
    28     for(int i=1;i<=n;i++){
    29         for(int j=c/2+1;j>=0;j--)
    30             for(int k=c/2+1;k>=0;k--){
    31                 if(sum[i]-j-k==e[i].t)f[j][k]+=e[i].h;
    32                 if(j<e[i].t&&k<e[i].t)continue;
    33                 if(j==e[i].t)f[j][k]=min(f[j][k],f[j-e[i].t][k]+e[i].h);
    34                 if(j>e[i].t)f[j][k]=min(f[j][k],f[j-e[i].t][k]);
    35                 if(k==e[i].t)f[j][k]=min(f[j][k],f[j][k-e[i].t]+e[i].h);
    36                 if(k>e[i].t)f[j][k]=min(f[j][k],f[j][k-e[i].t]);
    37             }
    38     }
    39     long long ans=10000000000LL;
    40     for(int j=1;j<=c/2+1;j++)
    41         for(int k=1;k<=c/2+1;k++){
    42             if(c-j-k<=0)break;
    43             ans=min(ans,(f[j][k]>=inf?inf:f[j][k])*max(max(j,k),c-j-k));
    44         }
    45     cout<<ans<<endl;
    46 }
    47 int main(){
    48     init();
    49     work();
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    TCP详解——传输控制协议(总述)
    sublime text3使用插件SublimeTextTrans设置透明度
    vue学习1
    js事件绑定/监听
    如何成为顶级程序猿
    HTML5中meta属性
    windows安装SVN服务器并设置开机启动
    oracle安装登录sqlplus / as sysdba然后报错ERROR: ORA-01031 insufficient privileges
    移动端和PC端有什么区别
    div+css通用兼容性代码整理
  • 原文地址:https://www.cnblogs.com/chadinblog/p/5847374.html
Copyright © 2011-2022 走看看