/*
translation:
给出n门作业,没门作业有期限和完成所需的时间。超过期限每一天就扣掉一分。求最少扣掉多少分。并按字典序给出
作业的完成顺序。
solution:
状压dp
仔细观察题意可以发现就是求作业的某一种排列顺序使得满足最优解。所以用动态规划的状态表示一定涉及到集合。
又考虑到数据量不多。所以可以用状态压缩。
note:
1:注意枚举作业状态时候的顺序,见代码注释。
# 最初的思路是这样定义状态的dp[i][j][k]:表示在第k天完成了i项作业,且最后一项作业为j的最小已拖延天数。
则状态转移方程:dp[i][j][k]=min(dp[i-1][t][k-ci])+k-dj。正确与否未知,待补。。。。。。
* 注意这道题的dp数组表示方式。开太多维的数组没必要。
* 涉及到集合的表示且数据量小的动规一般考虑状压。
date:
2016.10.30
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 15;
const int INF = 1e9;
struct Subject
{
string name;
int d, c;
Subject(string n, int d, int c):name(n),d(d),c(c){}
Subject(){}
} sub[maxn];
struct DP
{
int current, pre, score, time; //当前状态完成的作业编号,先前一个状态的编号,到当前状态为止的最少惩罚,到当前状态的时间
} dp[1 << maxn + 5]; //dp[s]表示当前状态编号为s的各种信息。
int n;
bool vis[1 << maxn + 5];
hdu1074(状压)
最新推荐文章于 2020-02-28 23:09:08 发布