题目
题目描述
从起点到终点有N步,如果“走”第K步,将会得到A[K]元钱,A[K]可能为负数。
你也可以花100元钱“跳过”当前的这一步,即不会得到A[K]。但是任何时刻身上的钱都必须是非负的。开始时,你身上共有0元。给定数组A,求在能到达终点的情况下最小需要走过(即不是用100元钱跳过)的步数。注意:最后一步必须走,不能选择跳过。
输入
共有两行。
第一行为整数N(0<=N<=100)。
第二行有N个整数,第K个数为A[K],-10000<=A[K]<=10000。
输出
一个整数,表示需要走的最少步数。若无法走到终点,输出-1。
解题思路
用模拟最多能对7个点,正解是用动态规划做,开两个数组,分别为ff[i][j](前i个点走j步时的花费),和f[i][j](前i个点跳了j步时的花费)
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,a[110],ans,f[110][110],ff[110][110];
int main()
{
//freopen("steps.in","r",stdin);
//freopen("steps.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
for (int j=0;j<=i;j++)
f[i][j]=ff[i][j]=-214748364; //初始化
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
{
int tt=max(f[i-1][j],ff[i-1][j]);
if (tt>=100&&i!=n) f[i][j]=tt-100;
tt=max(f[i-1][j-1],ff[i-1][j-1]);
if (tt+a[i]>=0) ff[i][j]=tt+a[i];【也可以用三维做】
}
for (int i=1;i<=n;i++)
if (ff[n][i]>=0) {printf("%d",i); return 0;} //有一个满足条件,就输出
printf("-1");
}