HDU 1074 Doing Homework 状压Dp
2015-05-02 00:18
218 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68966#problem/D
题意:给定各个科目的截至时间和完成该科目所需要的时间,求最小逾期值。
刚开始拿到该题目,不知道思路,百度才反应过来,科目为15明显是状压Dp的标志嘛。。。。
然后终于写出来了。。。好费劲啊。。。太弱了。。
代码:
题意:给定各个科目的截至时间和完成该科目所需要的时间,求最小逾期值。
刚开始拿到该题目,不知道思路,百度才反应过来,科目为15明显是状压Dp的标志嘛。。。。
然后终于写出来了。。。好费劲啊。。。太弱了。。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #define maxn (1<<16) #define INF 0x7fffffff using namespace std; struct node{ string s; int d,c; }A[20]; //sum表示已经过去的天数,front记录新加入的点 int N,dp[maxn],sum[maxn],front[maxn]; void disp(int k){ if(k-(1<<front[k])>0) disp(k-(1<<front[k])); cout<<A[front[k]].s<<endl; } void Dp(){ for(int i=0;i<(1<<N);i++) dp[i]=INF;//初始化 memset(sum,0,sizeof(sum));//初始化 for(int i=0;i<N;i++)//初始化起始点 sum[1<<i]=A[i].c,dp[1<<i]=max(A[i].c-A[i].d,0),front[1<<i]=i; for(int i=0;i<(1<<N);i++){ if(dp[i]==INF) continue; for(int j=0;j<N;j++){ if((i&(1<<j))==1) continue; int s=i|(1<<j); int t=dp[i]+max(sum[i]+A[j].c-A[j].d,0); if(t<dp[s]){ front[s]=j; dp[s]=t;sum[s]=sum[i]+A[j].c; }else if(t==dp[s] && j>front[s]) front[s]=j; } } int t=(1<<N)-1; cout<<dp[t]<<endl; disp(t);//用递归比较好打印解 } int main(){ //freopen("in.txt","r",stdin); int T;cin>>T; while(T--){ cin>>N; for(int i=0;i<N;i++) cin>>A[i].s>>A[i].d>>A[i].c; Dp(); } return 0; }
相关文章推荐
- 【状压DP+输出路径】HDU-1074 Doing Homework
- 【状压dp】HDU 1074 Doing Homework
- hdu 1074 Doing Homework【状压dp】好题
- HDU 1074 Doing Homework「状压dp」
- HDU 1074 Doing Homework【状压DP】
- HDU 1074 A - Doing Homework 【状压DP】
- HDU 1074 Doing Homework 状压DP
- HDU 1074-Doing Homework(状态压缩dp)
- HDU 1074 Doing Homework 经典DP
- HDU 1074 Doing Homework DP 状态压缩
- HDU1074 Doing Homework 状态压缩DP
- 每日三题-Day2-A(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
- HDU 1074:Doing HomeWork(状态压缩DP)
- 杭电hdu 1074 Doing Homework dp
- Doing Homework(hdu)1074
- HDU 1074 Doing Homework,dfs+剪枝(280ms),状态压缩+dp(15ms)