POJ3616 简单DP
来源:互联网 发布:aes算法的原理和算法 编辑:程序博客网 时间:2024/05/29 08:01
题意 有m个区间,区间有一个权重,区间间有交叉,问你怎么选择区间让权重之和最大
思路 这题递推时,主要要想到,如果新的区间和之前选好的那个区间有交叉,那么去掉已选好区间最后面的那个区间,新的区间一定可以放进去。
dp[i]表示前i个区间,第i个区间一定放入的最大权值和。
先按开始时间进行排序。
当start[i] >= end[j]时,dp[i] = max(dp[i],dp[j]+value[i]) , 0<=j<i
最后结果取max就行了。
这题复杂度其实还可以再降到O(mlogm),以后还要再练习~
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxm = 1005;int dp[maxm];int n,m,r;struct Node{int s,e,v;}node[maxm]; bool cmp(Node x,Node y){return x.s < y.s || x.s == y.s && x.e< y.e;}int main(){scanf("%d%d%d",&n,&m,&r);int i,j;for(i=1;i<=m;i++){scanf("%d%d%d",&node[i].s,&node[i].e,&node[i].v);node[i].e += r;}sort(node,node+m+1,cmp);for(i=1;i<=m;i++){for(j=0;j<i;j++){if(node[i].s >= node[j].e)dp[i] = max(dp[i],dp[j]+node[i].v);}}int ans = 0;for(i=1;i<=m;i++)ans = max(ans,dp[i]);cout<<ans<<endl;return 0;}
0 0
- POJ3616 简单DP
- poj3616 dp
- poj3616 dp
- POJ3616 Milking Time 【DP】
- POJ3616 Milking Time DP
- POJ3616【基础DP】
- poj3616 Miking Time dp
- poj3616(dp)
- POJ3616 Milking Time (dp)
- poj3616 Milking Time 入门dp
- poj3616 带权值的区间dp
- poj3616
- poj3616
- POJ3616
- poj3616
- poj3616
- poj3616
- [动态规划]POJ3616(dp入门题)
- 最快速的Android开发环境搭建ADT-Bundle及Hello World
- Oracle的对象类型
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- Java内存空间的详解
- 剑指Offer --> Question 33
- POJ3616 简单DP
- leetcode-147 Insertion Sort List
- Java空间详解
- linux 安装pcre报错“You need a C++ compiler for C++ support.”解决办法
- [LeetCode Java] 2 Add Two Numbers
- hdu 5058 So easy (排序+离散化)
- Android编码规范(Java部分)
- Leetcode: Plus One
- 关闭safari浏览器button默认样式