您的位置:首页 > 其它

hdu 1074 doing homework

2016-05-28 12:16 387 查看
思路:纪录每个状态的最小花费dp[i] 然后转移 转移的时候要用到位运算 用1<<j表示第j个课程的选择 i&(<span style="font-family: Arial, Helvetica, sans-serif;">1<<j)检测是否由dp[i-(</span><span style="font-family: Arial, Helvetica, sans-serif;">1<<j</span><span style="font-family: Arial, Helvetica, sans-serif;">)]转移而来 然后全部取最小的 ,但是这个地方的转移顺序很需要注意! 选择j的时候要n-1 to 0 因为要用字典序最小的状态转移而来 所以字典序排序应该是j越大 之前的状态字典序越小 </span>
#include <iostream>#include <string>#include <cstring>#include <stack>#include <algorithm>using namespace std;const int inf = 1<<30;struct node{string name;int dead,cost;} a[50];struct kode{int time,score,pre,now;} dp[1<<15];int main(){int t,i,j,s,n,end;cin >> t;while(t--){memset(dp,0,sizeof(dp));cin >> n;for(i = 0; i<n; i++)cin >> a[i].name >> a[i].dead >> a[i].cost;end = 1<<n;for(s =  1; s<end; s++){dp[s].score = inf;for(i = n-1; i>=0; i--) // 此处转移应该注意顺序 n-1 to 0<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
            {int tem = 1<<i;if(s & tem){int past = s-tem;int st = dp[past].time+a[i].cost-a[i].dead;if(st<0)st = 0;if(st+dp[past].score<dp[s].score){dp[s].score = st+dp[past].score;dp[s].now = i;dp[s].pre = past;dp[s].time = dp[past].time+a[i].cost;}}}}stack<int> S;int tem = end-1;cout << dp[tem].score << endl;while(tem){S.push(dp[tem].now);tem = dp[tem].pre;}while(!S.empty()){cout << a[S.top()].name << endl;S.pop();}}return 0;}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: