您的位置:首页 > 其它

hdu 1074 Doing Homework

2012-11-12 18:51 363 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1074

状态压缩DP 的模板题

学习了一下状态压缩DP

这里处理字典序的方法 有排序,貌似排序的还简单一些

我用的指针

signp指向上一个状态,p指向状态对应取的字符串

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
const int inf=1000000000;
struct node
{
char word[105];
int deadline;
int cost;
}num[20];
struct knode
{
int score;
int signp;
int p;
int cost;
}dp[1<<16];
void dfs(int n)
{
if(n==0)
return;
dfs(dp
.signp);
puts(num[dp
.p].word);
}
int main()
{
int T;
int n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s%d%d",num[i].word,&num[i].deadline,&num[i].cost);
dp[0].cost=0;
dp[0].score=0;
for(int i=1;i<(1<<n);i++)
{
dp[i].score=inf;
for(int j=1;j<=n;j++)
{
int m=1<<(j-1);
if(m&i)
{
int k=i-m;
int score=num[j].cost-(num[j].deadline-dp[k].cost);
if(score<0)
score=0;
if(score+dp[k].score<dp[i].score)
{
dp[i].cost=dp[k].cost+num[j].cost;
dp[i].score=score+dp[k].score;
dp[i].signp=k;
dp[i].p=j;
}
else if(score+dp[k].score==dp[i].score&&strcmp(num[dp[i].p].word,num[j].word)<0)
{
dp[i].cost=dp[k].cost+num[j].cost;
dp[i].score=score+dp[k].score;
dp[i].signp=k;
dp[i].p=j;
}
}
}
}
printf("%d\n",dp[(1<<n)-1].score);
dfs((1<<n)-1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: