zoukankan      html  css  js  c++  java
  • 尼克的任务 dp 洛谷1280

      蒟蒻表示老久没看过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[n]即为结果

     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[n]);
    33     return 0;
    34 }

     

      

  • 相关阅读:
    Peer code review
    分析图书管理系统的5W1H
    项目风险分析作业
    课堂练习
    功能分析四个象限
    Android需求分析作业
    电梯演说模板练习
    敏捷流程的理解
    团队模型的小组辩论
    结对编程任意Demo
  • 原文地址:https://www.cnblogs.com/CtsNevermore/p/5993094.html
Copyright © 2011-2022 走看看