/*【题意】
给你一个长度为m([1,2000])的长条状容器。
然后我们有n([1,1000])段木棒。
第i段木棒有一个长度a[i].l和价值a[i].v。
我们希望把尽可能大价值的木棒放到容器中,使得所有木棒的重心都在容器内
要求木棒不能重叠。【分析】
用f[i][j][u]表示现在处理到前i根木棍,它们在容器内占据的长度为j,且有u条木棍悬挂在外的最大价值。
这个DP多加了一个维度u,显然u的取值范围是[0,2]
同样采取使得half=原长len,使得len=原长len的2倍的避免小数的策略。
那么我们有状态转移方程
gmax(f[i][j][u],f[i-1][j-a[i].len][u]+a[i].val);
gmax(f[i][j][u],f[i-1][j-a[i].half][u-1]+a[i].val);
这样从所有的子状态中更新答案。注意,我们可以使用三维数组表示空间,这里也可以下降为只有[j][u],第一维度的i可以省略。
这样压缩空间的做法需要注意保证拓扑序。要无环,要避免同一个木棍多次更新状态。
我们只要改变枚举顺序,使得j降序。
因为每个物品的空间都至少为1,所以不论u的顺序,这里就可以保证,一定不会重复更新。【时间复杂度&&优化】
O(n^2)
*/#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1005, M = 4005;
struct Node
{int h, l, v;bool operator < (const Node &other) const{return h < other.h;}
}a[N];
LL dp[M][3];
LL solve()
{int n, m;scanf("%d%d", &n, &m);m<<=1;LL ans = 0;memset(dp, 0, sizeof(dp));for(int i = 1; i <= n; i++){scanf("%d%d", &a[i].h, &a[i].v);a[i].l = (a[i].h<<1);if(a[i].v > ans) ans = a[i].v;}sort(a+1, a+n+1);while(n>=1&&a[n].h>=m) n--;for(int i = 1; i <= n; i++)for(int j = m; j >= a[i].h; j--)for(int u = 0; u <= 2; u++){if(j>=a[i].l) dp[j][u] = max(dp[j][u], dp[j-a[i].l][u] + a[i].v);if(u) dp[j][u] = max(dp[j][u], dp[j-a[i].h][u-1]+a[i].v);}ans = max(ans, dp[m][2]);return ans;
}
int main()
{int t, kase = 1;scanf("%d", &t);while(t--){printf("Case #%d: %I64d\n", kase++, solve());}return 0;
}
详细解决方案
HDU5543Pick The Sticks(01背包)
热度:93 发布时间:2023-12-06 19:29:23.0
相关解决方案
- POJ 1011 Sticks DFS+很多剪枝 *
- UVA10003[Cutting Sticks] 区间动态规划模型
- HDU 1051 Wooden Sticks 【贪心】
- CodeForces 571A Lengthening Sticks (组合数学)
- HDU 1455 Sticks(dfs+强剪枝)
- Sticks(dfs+枝剪练习)
- 【贪心算法】Wooden Sticks(资源调度问题)
- POJ 1011 Sticks【DFS+剪枝】
- HDU5543Pick The Sticks(01背包)
- Wooden Sticks HDU 1051
- pku 2455 Sticks Problem
- Codeforces Round #533 (Div. 2)A. Salem and Sticks
- 【POJ-2653-Pick-up sticks】计算几何+STL
- 【POJ 2513 Colored Sticks】 字典树(Trie树)
- POJ/UVA307 1011 Sticks (DFS +强力剪枝 (经典))
- poj 2513 Colored Sticks (字典树+并查集+欧拉回路)
- 1270: Wooden Sticks [贪心]
- Sticks//拼火柴//Central Europe 1995//dfs
- Uva - 10003 - Cutting Sticks
- UVA - 10003 Cutting Sticks - (DP)
- POJ 2452 Sticks Problem(贪心做法非RMQ)
- POJ 2653 Pick-up sticks 线段交
- codeforces 394A Counting Sticks(题目虽简单,但是考虑的情况多,需仔细)
- uva 10003 - Cutting Sticks(区间DP)
- POJ1065 Wooden Sticks(贪心||DP)
- 例题9-9 UVa10003 Cutting Sticks(DP:矩阵链乘)
- poj 2513 Colored Sticks 字典树
- 《Wooden Sticks》
- Cutting Sticks
- UVA 10003 Cutting Sticks (区间DP+四边形不等式)