zoukankan      html  css  js  c++  java
  • 2050编程赛 冰水挑战 HDU 6495

     

    题目地址:https://vjudge.net/problem/HDU-6495

    思路:
    我们需要维护的是挑战了n个之后剩余体力值,剩余体力值越大越好
    dp[N(i)][N(j)],第一个维度,记录当前是第i个挑战,第二个维度记录在当前第i挑战时,对于前1~i个挑战的其中几个是否挑战的情况与之前的情况相比较记录最好的情况。
    1.初始化dp[0][0] = C;
    2.判断你要挑战第x个时,x-1个挑战是否完成,如果x-1个挑战都无法完成,那么x个挑战无法开始
    3.W = min(剩余体力,b) - a;
    4.判断W>0?
    (1)如果大于零, 比较上个状态(也需要判断上个状态是否能挑战x个)和这个挑战x个的体力剩余
    (2) 不大于零 , 无法挑战,记录上个挑战了x个的挑战(也需要判断上个状态是否能挑战x个)
    5.对最后一个挑战的dp值进行倒叙遍历,找到第一个体力值>0,及当前下标是最大挑战次数


     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
     5 #define per(i,j,k) for(int i = (j); i >= (k); i--)
     6 
     7 typedef long long LL;
     8 const int N = 1e3 + 10;
     9 LL dp[N][N];
    10 LL a[N], b[N], c[N];
    11 
    12 void init(int n ){
    13     rep(i, 0, n)rep(j, 0, n) dp[i][j] = 0;
    14 }
    15 
    16 int main(){
    17 
    18     ios::sync_with_stdio(false);
    19     cin.tie(0);
    20 
    21     int T;
    22     cin >> T;
    23 
    24     rep(x, 1, T){
    25 
    26         int n, C;
    27         cin >> n >> C;
    28 
    29         init(n);
    30 
    31         rep(i, 1, n) cin >> a[i] >> b[i] >> c[i];
    32 
    33         dp[0][0] = C;//1.初始化dp[0][0] = C;
    34 
    35         rep(i, 1, n){
    36             dp[i][0] = dp[i - 1][0] + c[i];
    37 
    38             rep(j, 1, i){
    39                 if (dp[i - 1][j - 1] == 0) continue;//2.判断你要挑战第x个时,x-1个挑战是否完成,
    40                                                    // 如果x-1个挑战都无法完成,那么x个挑战无法开始
    41                 LL W = min(dp[i - 1][j - 1], b[i]) - a[i];//3.W = min(剩余体力,b) - a;
    42                 //(dp[i - 1][j] != 0) * c[i],,如果dp值是0,则判断上个状态是不能挑战x个
    43                 // 那么0 + 0 * c
    44                 if (W > 0) dp[i][j] = max(dp[i - 1][j] + (dp[i - 1][j] != 0)*c[i], W + c[i]);
    45                 else dp[i][j] = dp[i - 1][j] + (dp[i - 1][j] != 0)*c[i];
    46             }
    47         }
    48         //5.对最后一个挑战的dp值进行倒叙遍历,找到第一个体力值>0,及当前下标是最大挑战次数
    49         per(o, n, 0){
    50             if (dp[n][o]){
    51                 cout << o << endl;
    52                 break;
    53             }
    54         }
    55     }
    56 
    57 
    58     return 0;
    59 }
     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 typedef long long ll;
     7 const int N = 1010;
     8 ll dp[N];
     9 
    10 /*
    11     时隔好久了,重新回顾了一遍“背包九讲”,发现自己的理解进一步了,这里再发部一维的吧
    12 */
    13 int main(){
    14 
    15     int T;
    16     scanf("%d",&T);
    17 
    18     while(T--){
    19             
    20         int n;
    21         ll t;
    22         scanf("%d%lld",&n,&t);
    23 
    24         dp[0] = t;
    25         for(int i = 1; i <= n; i++)
    26             dp[i] = 0;
    27 
    28         ll a,b,c;
    29 
    30         for(int i = 1; i <= n; i++){
    31             scanf("%lld%lld%lld",&a,&b,&c);
    32 
    33             for(int j = i; j >= 1; j--){
    34 
    35                 if(dp[j - 1] <= 0) continue;
    36 
    37                 ll tmp = min(dp[j - 1],b) - a;
    38                 if(tmp > 0)
    39                     dp[j] = max(dp[j]+(dp[j]>0)*c, tmp+c);
    40                 else 
    41                     dp[j] = dp[j]+(dp[j]>0)*c;
    42             }
    43             
    44             dp[0] += c;
    45         }
    46 
    47         for(int i = n; i >= 0; i--)
    48             if(dp[i] > 0){
    49                 printf("%d
    ",i);
    50                 break;
    51             }
    52 
    53     }
    54 
    55 
    56     return 0;
    57 }
  • 相关阅读:
    102/107. Binary Tree Level Order Traversal/II
    110. Balanced Binary Tree
    SQL SERVER select,update,delete使用表别名
    C# 有哪些集合
    C# 流总结
    How ASP.NET MVC Works ? (Artech)
    c#扩展方法
    使用缓存的九大误区
    9中浏览器端缓存
    理解AppDomain和AppPool
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/11163754.html
Copyright © 2011-2022 走看看