标签:
2 3 Computer 3 3 English 20 1 Math 3 2 3 Computer 3 3 English 6 3 Math 6 3
2 Computer Math English 3 Computer English MathHintIn the second test case, both Computer->English->Math and Computer->Math->English leads to reduce 3 points, but the word "English" appears earlier than the word "Math", so we choose the first order. That is so-called alphabet order.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> using namespace std; const int maxn=1<<15; char s[20][110]; int dp[maxn],t[maxn],pre[maxn];//dp[i]储存做作业的各种状态。t[i]表示经过的时间,pre[i]表示某种状态的的前驱 int dead[20],fin[20]; void print(int x) { if(!x) return ; print(x-(1<<pre[x])); printf("%s\n",s[pre[x]]); } int main() { int tt,n; scanf("%d",&tt); while(tt--) { scanf("%d",&n); memset(t,0,sizeof(t)); memset(pre,0,sizeof(pre)); for(int i=0;i<n;i++) scanf("%s%d%d",&s[i],&dead[i],&fin[i]); int end=1<<n; for(int i=1;i<end;i++) { dp[i]=INT_MAX; for(int j=n-1;j>=0;j--)//从后往前枚举 { int temp=1<<j; if(!(i&temp)) continue; int cost=t[i-temp]+fin[j]-dead[j];//时间消耗 if(cost<0) cost=0; if(dp[i]>dp[i-temp]+cost) { dp[i]=dp[i-temp]+cost; t[i]=t[i-temp]+fin[j]; pre[i]=j; // cout<<i<<" "<<j<<endl; } } } printf("%d\n",dp[end-1]);//end-1是每种作业都完毕的状态 print(end-1); } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
HDU 1074 Doing Homework(像缩进DP)
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4670086.html