尼克的任务 dp 洛谷1280
2016-11-08 11:20
232 查看
蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,,
首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始的任务个数,初始化dp[i] i = 1 -> n 为 -1, dp[0]为0
转移时,对于dp[i],如果dp[i-1] 为 -1,无法完成转移
如果dp[i-1] > 0分两种情况
1、如果i时刻无任务,直接dp[i] = max{dp[i], dp[i-1] + 1}
2、如果i时刻有任务,枚举任务,使dp[to[i][j]] = max{dp[to[i][i]],dp[i-1]}
输出dp
即为结果
首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始的任务个数,初始化dp[i] i = 1 -> n 为 -1, dp[0]为0
转移时,对于dp[i],如果dp[i-1] 为 -1,无法完成转移
如果dp[i-1] > 0分两种情况
1、如果i时刻无任务,直接dp[i] = max{dp[i], dp[i-1] + 1}
2、如果i时刻有任务,枚举任务,使dp[to[i][j]] = max{dp[to[i][i]],dp[i-1]}
输出dp
即为结果
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 6 7 const int maxn = 10000 + 500; 8 int n, k; 9 std :: vector <int> to[maxn]; 10 int dp[maxn], cnt[maxn]; 11 int tx, ty; 12 13 int main () { 14 scanf("%d %d", &n, &k); 15 for (int i = 1; i <= k; i++) { 16 scanf("%d %d", &tx, &ty); 17 to[tx].push_back(tx + ty - 1); 18 cnt[tx]++; 19 } 20 for (int i = 1; i <= n; i++) dp[i] = -1; 21 dp[0] = 0; 22 for (int i = 1; i <= n; i++) { 23 if (dp[i-1] >= 0) { 24 if (cnt[i] > 0) { 25 for (int j = 0; j < to[i].size(); j++) 26 dp[to[i][j]] = std :: max(dp[to[i][j]], dp[i-1]); 27 } else { 28 dp[i] = std :: max(dp[i], dp[i-1] + 1); 29 } 30 } 31 } 32 printf("%d", dp ); 33 return 0; 34 }
相关文章推荐
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 尼克的任务 dp 洛谷1280
- 洛谷 1280 尼克的任务 DP 解题报告
- 洛谷1280 尼克的任务
- 洛谷二连:1280尼克的任务——1282多米诺骨牌
- 1280 洛谷 尼克的任务
- 洛谷P1280 尼克的任务(dp)