HOJ 11915 TV Battle

 TV Battle

问题描述

     给定n个区间,每个区间i([si,ti])有一个价值为pi,在满足相容性的条件下如何选择区间使得所得到的价值最大,求解最大价值。数据规模:n<=100000, t<=10080,Time Limit:1000ms。

问题分析

     这是一道动态规划题目,构造出一个状态转移方程并不是难题。事实上,我在作出这道题目之前就构造出了2个状态转移方程,都是TLE报错。

  最后AC的解法:

           定义f[i]:区间[0,i]内所能获得的最大价值:

                   <1>、将各个区间按照终点升序排列;

                   <2>、只在每个区间结束点出更新最优解。

                   <3>、非终点处只需将在该点之前以求得的最优值传递下去;

           最好自己动手画一些线段模拟一下就知道了。

#include<iostream> #include<algorithm> using namespace std; int f[10081]; struct TV{ int s,l,t,v;//区间为[s,t],l=t-s,价值为v }tv[100001]; bool cmp(struct TV a,struct TV b){ return a.t<b.t; } int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); int lmt=0;//记录最大结束时间 for(int i=0;i<n;i++){ scanf("%d%d%d",&tv[i].s,&tv[i].l,&tv[i].v); tv[i].t=tv[i].s+tv[i].l; if(tv[i].t>lmt) lmt=tv[i].t; } sort(tv,tv+n,cmp); f[0]=0; int k=0,tmp=tv[0].t; for(int i=1;i<=lmt;i++){ f[i]=f[i-1];//传递最优值 if(tmp>i) continue; while(k<n && i==tmp){ if(f[i-tv[k].l]+tv[k].v>f[i])//DP的核心思想,类似于背包问题的决策 f[i]=f[i-tv[k].l]+tv[k].v; tmp=tv[++k].t; } } printf("%d/n",f[lmt]); } return 0; }

你可能感兴趣的:(HOJ 11915 TV Battle)