HDU 1074 Doing Homework状态DP
来源:互联网 发布:棱镜门事件 知乎 编辑:程序博客网 时间:2024/06/10 15:54
此题总状态量很小,可以状态DP
#include <stdio.h>#include <cstring>using namespace std;struct point{char str[110];int cost,dead;}sub[20];int n;int dp[32800],pre[32800],visit[32800],time[32800];void print(int state){if(pre[state]==-1)return;print(state^(1<<(pre[state]-1)));printf("%s\n",sub[pre[state]].str);}int main(){int t,T,sum;scanf("%d",&T);for(t=1;t<=T;t++){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s %d %d",&sub[i].str,&sub[i].dead,&sub[i].cost);}sum=(1<<n)-1;memset(visit,0,sizeof(visit));dp[0]=0,time[0]=0,pre[0]=-1,visit[0]=1;for(int i=0;i<=sum;i++){for(int j=1;j<=n;j++){if( (i& (1<<(j-1)) ) ==0){int tempun=0,t,cur;if(time[i]+sub[j].cost>sub[j].dead)tempun=time[i]+sub[j].cost-sub[j].dead;tempun+=dp[i];t=time[i]+sub[j].cost;cur=(i| (1<<(j-1)) );if(!visit[cur]){dp[cur]=tempun,pre[cur]=j,time[cur]=t;visit[cur]=1;}else{if(dp[cur]>tempun) // 因为枚举的时候是按照字典序进行的,所以这里如果相等就不用更新了dp[cur]=tempun,pre[cur]=j,time[cur]=t;}}}}printf("%d\n",dp[sum]);print(sum);}}
- hdu 1074 doing homework 状态dp
- HDU 1074 Doing Homework状态DP
- hdu 1074 Doing Homework(dp+状态压缩)
- HDU 1074 Doing Homework (状态压缩DP)
- hdu 1074 Doing Homework 状态DP+dfs
- HDU 1074 Doing Homework(状态DP)
- hdu 1074 Doing Homework (状态压缩 + DP)
- 【状态DP】 HDU 1074 Doing Homework
- HDU-1074 Doing Homework 状态压缩DP
- HDU 1074 Doing Homework(状态压缩DP)
- hdu 1074 Doing Homework(状态压缩dp)
- hdu 1074 Doing Homework dp+状态压缩
- hdu 1074 状态压缩+DP Doing Homework
- HDU 1074 Doing Homework 状态压缩DP
- hdu 1074 Doing Homework 状态压缩dp
- HDU 1074 Doing Homework 状态DP
- Hdu 1074 Doing Homework 状态压缩DP
- 状态压缩DP-HDU-1074-Doing Homework
- malloc (0)详解
- IE8下JS无法获得file控件全路径的解决办法
- 递归算法查找最大子序列——类名字取的不太好
- 10个优秀的JavaScript参考手册
- synchronized的作用
- HDU 1074 Doing Homework状态DP
- Boost.Interprocess使用手册翻译之五:独立于映射地址的指针:offset_pt (Mapping Address Independent Pointer: offset_ptr)
- fedora 16 DELETE键删除文件
- Linux cut 显示文本信息
- linux下安装apache + subversion
- IP 数据库,CSV 和 MDB 格式。
- library cache pin
- Dating with girls(1)
- 两条语句实现有则更新,无则新增