动态规划训练16 [Doing Homework HDU
来源:互联网 发布:计价软件 编辑:程序博客网 时间:2024/05/23 14:34
Doing Homework
HDU - 1074这是一道状态压缩DP(从N <= 15就可以看出来)。
我们定义二进制状态S代表的是目前已经安排好的任务
dp[S].val代表的是目前已经安排好的任务的扣分的最小值
dp[S].sumT代表的是目前已经安排好的任务所需要的时间
状态转移的时候我们只考虑下一个任务的选取
设S通过新任务的选取转移到下一个状态tar
tar = S | (1<<i) ;选取第i个任务
那么状态转移一可以写成
if(dp[S].sumT + Ts[i] > ddls[i])//当新任务的选取超过了ddl而被扣分,那么计算扣分cost = dp[S].sumT + Ts[i] - ddls[i];
if(dp[tar].val > dp[S].val + cost ){//更新dp[tar].val = dp[S].val + cost;dp[tar].sumT = dp[S].sumT + Ts[i];dp[tar].pre = S;//设置前驱,记录路径}完整代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct node{int sumT;int val;int pre;};node dp[(1<<15)];const int INF = 1e9;const int MAX = 20;int ddls[MAX];int Ts[MAX];char names[MAX][100];int order[16];int calc(int x){int cnt = 0;while(x){cnt++;x >>= 1;}return cnt-1;}int main(){int T;scanf("%d",&T);while(T--){for(int i = 0;i < (1<<15);i++){dp[i].val = INF;}int n;scanf("%d",&n);for(int i = 0;i < n;i++){scanf("%s %d%d",names[i],&ddls[i],&Ts[i]);}dp[0].pre = 0;dp[0].sumT = 0;dp[0].val = 0;for(int S = 0;S < (1<<n);S++){for(int i = 0;i < n;i++){if((S & (1<<i)) == 0){int tar = S|(1<<i);int cost = 0;if(dp[S].sumT + Ts[i] > ddls[i])cost = dp[S].sumT + Ts[i] - ddls[i];if(dp[tar].val > dp[S].val + cost ){dp[tar].val = dp[S].val + cost;dp[tar].sumT = dp[S].sumT + Ts[i];dp[tar].pre = S;}}}}cout<<dp[(1<<n)-1].val<<endl;int S = (1<<n)-1;int cnt = n;while(S){int nS = dp[S].pre;int t = calc(nS ^ S);order[--cnt] = t;S = nS;}for(int i = 0;i < n;i++){cout<<names[order[i]]<<endl;}}return 0;}
阅读全文
0 0
- 动态规划训练16 [Doing Homework HDU
- HDU 1075 Doing homework 动态规划状态压缩
- 动态规划入门——Doing Homework
- 动态规划:HDU1789-Doing Homework again
- D - Doing Homework HDU1074 ( 动态规划 + 状态压缩 )
- HDU 1074 Doing Homework
- hdu 1074 Doing Homework
- HDU-1074-Doing Homework
- hdu-doing homework
- hdu 1074 Doing Homework
- hdu 1074 Doing Homework
- HDU Doing Homework again
- hdu Doing Homework again
- hdu-1074-Doing Homework
- HDU Doing Homework again
- HDU - 1074 Doing Homework
- HDU 1074 Doing Homework
- HDU 1074 Doing Homework
- Android基础之补间动画入门
- Kali Linux 的更新
- SAPUI5教程——SAP WEB IDE崩溃
- 600X笔记(week-1 计算机科学简介及编程基础)
- mac_命令行删除Git本地库
- 动态规划训练16 [Doing Homework HDU
- 解决tomcat启动startup.bat闪退
- 正式认识一下Markdown
- QString、string和C字符串相互转换
- 结束,也是开始
- 通用权限模块 权限粒度精确到菜单上的按钮
- 悟透JavaScript
- C++网络框架和库
- 【AOJ 869】迷宫(DFS)