HDU 5534 Partial Tree (2015长春站H题&&完全背包)
2015-11-02 23:18
399 查看
今天写了这题,再次感慨,失去了拿我们学校首金的机会,今天花了20分钟1A了这题。这么简单的背包DP,比赛的时候被我想那么复杂,我花了2个小时搞了这题,看到题目我就想想到了是背包DP,然后开心地列了一个二维背包DP方程,一直想着降维,优化,始终没有搞定,也考虑了一开始先给每个点分配一个度数,然后现有的度数变成了了n−2n-2,复杂度由原来的o(n∗2∗(n−1)∗(n−1))o(n*2*(n-1)*(n-1))变成了o(n∗(n−2)∗(n−1))o(n*(n-2)*(n-1))!!!我TMD简直就是个SB!!!,就是个SB!!!我居然没想到这个时候每个总的容量只有n−2n-2,每一个物品都可以取无限次了,直接就少了一维,这个时候就是一个SB背包DP,全场那么多人A了这题!!!我楞是卡了2个小时,最后只能放弃!!!泪崩!!!
这道题不想多说什么,只给给一个转移方程:
dp[v]=max(dp[v],dp[v−c[i]]+w[i])dp[v]=max(dp[v],dp[v-c[i]]+w[i])
这里c[i],w[i],dp[v]c[i],w[i],dp[v]预处理一下搞定。
下面是代码:
这道题不想多说什么,只给给一个转移方程:
dp[v]=max(dp[v],dp[v−c[i]]+w[i])dp[v]=max(dp[v],dp[v-c[i]]+w[i])
这里c[i],w[i],dp[v]c[i],w[i],dp[v]预处理一下搞定。
下面是代码:
#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) using namespace std; const int maxn = 2020; const int inf = 0x3fffffff; int dp[maxn<<1],c[maxn],w[maxn];; int n,m; void init(){ scanf("%d",&n); FOR(i,1,n) scanf("%d",&w[i]),c[i] = i; } void work(){ if(n == 2) {printf("%d\n",2*w[1]);return;} m = n-2; FOR(i,0,n<<1) dp[i] = -inf; w[0] = w[1]; dp[0] = n*w[0]; n --; FOR(i,1,n) w[i] = w[i+1]-w[0]; FOR(i,1,n){ FOR(v,c[i],m+1){ dp[v] = max(dp[v],dp[v-c[i]]+w[i]); } } printf("%d\n",dp[m]); } int main() { //freopen("test.in","r",stdin); int T; scanf("%d",&T); while(T--){ init(); work(); } return 0; }
相关文章推荐
- MSI(转)
- mvn不是内部或外部命令
- python中format的实例
- python问题1:ERROR 10053错误
- 设计模式之--代理模式
- 51nod 1009:数字1的数量
- [urls.py设置技巧]Django是如何处理URLconf的?
- handsontable 排序问题
- 51nod 1009:数字1的数量
- leetcode之Longest Consecutive Sequence
- IO操作(C#)
- HTTP POST GET 本质区别详解
- Fragment基础点滴学习---Activity向Fragment传递数据
- 51nod 1102 面积最大的矩形
- OC03 继承、初始化方法2
- 抽象工厂模式
- 斯坦福大学CS244d学习笔记
- 根据颜色和大小 画图
- 用Python操作Oracle
- Retina屏的移动设备如何实现真正1px的线?