• SSLZYC 最小步数


    题目大意:
    从起点到终点有N步,如果走第K步,将会得到A[K]元钱,A[K]可能为负数。你也可以花100元钱“跳过”当前的这一步,即不会得到A[K]。但是任何时刻身上的钱都必须是非负的。开始时,你身上共有0元。给定数组A,求在能到达终点的情况下最小需要走过的步数。注意:最后一步必须走,不能选择跳过。请问到达终点最少需要多少步?


    思路:
    一个明显的DP题可是我不会打

    f[i][j][0]表示到了第i个位置,走了j步(跳了i-j步),下一步要跳时剩余的钱数。
    f[i][j][1]表示到了第i个位置,走了j步(跳了i-j步),下一步要走时剩余的钱数。

    状态转移方程:

    f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])-100

    f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i];


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int f[101][101][2],n,a[101];
    
    int main()
    {
        freopen("steps.in","r",stdin);
        freopen("steps.out","w",stdout);
        scanf("%d",&n);
        for (int q=1;q<=n;q++)
         scanf("%d",&a[q]);
        for (int i=1;i<=n;i++)
         for (int j=0;j<=i;j++)
          f[i][j][0]=f[i][j][1]=-999999999;  //初始化 
        for (int i=1;i<=n;i++)
         for (int j=1;j<=i;j++)
         {
             if (max(f[i-1][j][0],f[i-1][j][1])>=100&&i!=n) f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])-100;  //计算下一步跳剩余的钱数 
             if (max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i]>=0) f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i];  //计算下一步走剩余的钱数 
         }
        for (int i=1;i<=n;i++)
         if (f[n][i][1]>=0||f[n][i][0]>=0)
         {
            printf("%d",i);  //输出答案 
            return 0;
         }
        printf("-1");  //无法到达输出“-1” 
        return 0;
    }
  • 相关阅读:
    Redis从入门到精通:初级篇(转)
    Spring配置中的"classpath:"与"classpath*:"的区别研究(转)
    maven常用命令
    JUC-线程池调度-ScheduledThreadPool
    JUC-线程池
    JUC-线程八锁
    JUC-ReadWriteLock
    JUC-Condition和Lock实践-线程按序交替执行
    Linux 查看.so中导出函数
    nginx配置反向代理
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313114.html
Copyright © 2020-2023  润新知