标签:poj
题意:
给出m个区间 以及 每个区间的起点 、终点 、权值 m个区间会有重叠
要求从这些区间中选择若干个区间 ,使得这些所选区间的权值和最大
选择要求:1.所选区间无重叠部分 2.两个所选区间的间隔至少为r
思路:
线性结构上的DP 状态定义为: d[i] 代表 从前往后选择 选择到第i个区间时 选择第i个区间的最大权值
转移:
d[i] = max(d[j]+w[i]); 其中d[j]应该满足 end[j] + r <= start[i];
code:
const int maxn = 1005; int n,m,r; int d[maxn]; struct interval{ int s,e,w; bool operator < (const interval ei) const{ return s < ei.s; } }itv[maxn]; void init(){ for(int i = 1; i <= m; i++){ scanf("%d%d%d",&itv[i].s,&itv[i].e,&itv[i].w); } } void solve(){ sort(itv+1, itv+1+m); memset(d, 0, sizeof(d)); for(int i = 1; i <= m; i++){ d[i] = max(d[i], itv[i].w); for(int j = 1; j <= i; j++){ if(itv[j].e + r <= itv[i].s){ d[i] = max(d[i], d[j]+itv[i].w); } } } cout << *max_element(d+1, d+1+m) << endl;; } int main(){ while(scanf("%d%d%d",&n,&m,&r) != EOF){ init(); solve(); } return 0; }
就是状态转移是不太容易思考 也并不难
最主要的是自己没能准确确定这道题目的思考方向 刚开始猜测八九不离十是DP,但是并不能完全确定 所以还贪心了许久 最终感觉没有办法贪心
想复杂了...
标签:poj
原文地址:http://blog.csdn.net/u013382399/article/details/45158027