题意:
给出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应该能容易的识别出它的模型 简单的线性规划 选或不选的问题 很简单的
就是状态转移是不太容易思考 也并不难
最主要的是自己没能准确确定这道题目的思考方向 刚开始猜测八九不离十是DP,但是并不能完全确定 所以还贪心了许久 最终感觉没有办法贪心
想复杂了...