背包dp

一道很早以前就见过的dp

dp[i][j][k]表示选到第i本书,第一层宽度为j,第二层宽度为k的最小高度,我们先把书按高度排序,然后转移就很方便了,因为高度降序,所以后选的书不影响之前选的,也就是说只有当前层没放过书才用这本书更新,否则维护原来的值,然后滚动数组,卡卡常数就过了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
struct data {
int h, t;
bool friend operator < (const data &a, const data &b) {
return a.h > b.h;
}
} a[N];
int pre, n;
ll ans = 1000000000000000ll;
int dp[][N][N], sum[N];
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%d%d", &a[i].h, &a[i].t);
sort(a + , a + n + );
for(int i = ; i <= n; ++i) sum[i] = sum[i - ] + a[i].t;
memset(dp, 0x3f3f, sizeof(dp));
dp[pre][][] = ;
for(int i = ; i <= n; ++i)
{
pre ^= ;
memset(dp[pre], 0x3f3f, sizeof(dp[pre]));
for(int j = ; j <= sum[n]; ++j)
for(int k = ; k <= sum[n]; ++k) if(dp[pre ^ ][j][k] < 0x3f3f3f3f)
{
if(j == ) dp[pre][j + a[i].t][k] = min(dp[pre][j + a[i].t][k], dp[pre ^ ][j][k] + a[i].h);
else if(j + a[i].t <= sum[n]) dp[pre][j + a[i].t][k] = min(dp[pre][j + a[i].t][k], dp[pre ^ ][j][k]);
if(k == ) dp[pre][j][k + a[i].t] = min(dp[pre][j][k + a[i].t], dp[pre ^ ][j][k] + a[i].h);
else if(k + a[i].t <= sum[n]) dp[pre][j][k + a[i].t] = min(dp[pre][j][k + a[i].t], dp[pre ^ ][j][k]);
if(sum[i] - j - k == a[i].t) dp[pre][j][k] = min(dp[pre][j][k], dp[pre ^ ][j][k] + a[i].h);
else if(sum[i] - j - k > a[i].t) dp[pre][j][k] = min(dp[pre][j][k], dp[pre ^ ][j][k]);
}
}
for(int i = ; i <= sum[n]; ++i)
for(int j = ; j <= sum[n]; ++j) if(i + j < sum[n] && dp[pre][i][j] < 0x3f3f3f3f) ans = min(ans, (max((ll)i, max((ll)j, sum[n] - (ll)i - (ll)j)) * (ll)dp[pre][i][j]));
printf("%lld\n", ans);
return ;
}

bzoj1933的更多相关文章

  1. BZOJ1933: [Shoi2007]Bookcase 书柜的尺寸

    传送门 很容易看出来这是一道DP题,那么怎么设置状态就成了这道题的关键.本题有点特殊的地方是有两个维度的状态,而每个维度又有三个部分的参数,如果全部设置出来的话肯定会MLE.首先对书的厚度状态简化. ...

随机推荐

  1. 【数学+枚举】OpenJ_POJ - C17J Pairs

    https://vjudge.net/contest/171652#problem/J [题意] 问有多少个正整数对(x,y),使得存在正整数p,q满足 1 <= T <= 15 1 &l ...

  2. 深入理解计算机操作系统——第10章:UNIX IO,打开,关闭,读写文件

    系统级IO:输入输出是主存与外部设备(磁盘,终端,网络)之间拷贝数据的过程 输入:从IO设备拷贝数据到主存中 输出:从主存中拷贝数据到IO设备中 10.1 unix IO 所有的IO设备都被模型化为文 ...

  3. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  4. hdu 4043 FXTZ II [ 概率 + Java大数]

    传送门 FXTZ II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hdu 4049 Tourism Planning [ 状压dp ]

    传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. Maven 手动添加本地jar包

    mvn install:install-file -Dfile=jar绝对路径 -DgroupId=项目组织唯一的标识符 -DartifactId=项目的唯一的标识符 -Dversion=jar版本 ...

  7. 怎么删除"自豪地采用WordPress"

    wordpress刚刚安装完毕,打开默认的主页,会发现底部有这样的一行文字:“自豪地采用WordPress”.当然了,我们做一个网站,不一定需要这些文字,我们可以删除或者修改这些文字.今天,小编就来教 ...

  8. Scrambled Polygon--poj2007(极角排序模板)

    http://poj.org/problem?id=2007 #include<stdio.h> #include<math.h> #include<algorithm& ...

  9. Pick-up sticks--poj2653(判断两线段是否相交)

    http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个 分析:  我刚开始想倒着遍历  因为n是100000   想着会 ...

  10. 动态规划:Monkey and Banana

    Problem Description A group of researchers are designing an experiment to test the IQ of a monkey. T ...