hdu 4293 dp求最大权值不重合区间
2013-09-05 00:03
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293
View Code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 506; struct Node{ int A,B; int num; bool operator < (const Node& rhs) const{ return B > rhs.B; } }group[maxn]; int G[maxn][maxn]; int dp[maxn]; //dp[i]表示前i个人,最大有多少个人没撒谎。 int main() { //freopen("E:\\acm\\input.txt","r",stdin); int N; while(cin>>N){ memset(G,0,sizeof(G)); for(int i=1;i<=N;i++){ int a,b; scanf("%d %d",&a,&b); if(a+b<N && G[a][b]+a+b<N) //这句才是关键。WA的原因。 G[a][b]++; } int cnt = 0; for(int i=0;i<N;i++) for(int j=0;j<N;j++){ if(G[i][j]){ group[cnt].A = i; group[cnt].B = j; group[cnt++].num = G[i][j]; } } sort(group,group+cnt); memset(dp,0,sizeof(dp)); int pv = 0; int i; for(i=1;i<=N;i++){ if(pv >= cnt) break; int a = group[pv].A; int num = group[pv].num; int b = group[pv].B; if(N-b == i){ dp[i] = max(dp[i-1],dp[a]+num); pv++; while(pv < cnt && N-group[pv].B == i){ dp[i] = max(dp[i],dp[group[pv].A]+group[pv].num); pv++; } } else{ dp[i] = dp[i-1]; } } printf("%d\n",dp[i-1]); } }
View Code
相关文章推荐
- !HDU 4293 排队分组说谎问题-dp-(不相交区间的最大个数)
- HDU 2571 路径权值最大 dp
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
- HDU-#1003 Max Sum(DP+区间最大子序列)
- HDU 4616 Game(经典树形dp+最大权值和链)
- hdu 1024 Max Sum Plus Plus(DP->k段连续区间的最大和)
- HDU 4293 Groups(区间dp)
- HDU 4293 Groups(区间DP)
- hdu 4293 区间DP
- HDU-1231,最大区间连续和总结-分治法-dp
- HDU 4293 Groups【区间dp】
- HDU 5242Game 树上的贪心 树形dp 求出使K条链的权值总和最大
- HDU 1003 Max Sum(最大区间和,DP)
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
- HDU 4293 Groups 区间覆盖 区间DP
- hdu 5115 Dire Wolf(区间dp)
- [HDU]1864最大报销额[dp][贪心?怎么可能!]
- 【HDU 3486】【二分+RMQ】 Interviewe 【最小化区间个数m,使得每个区间最大值和大于k】
- 51nod 1052 最大M子段和 (区间dp)
- Hdu 最大报销额(DP)