您的位置:首页 > 其它

【普及模拟】最小步数(steps.pas)//2018.1.31

2018-01-31 20:37 211 查看

题目

题目描述

从起点到终点有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
[i]>=0) {printf("%d",i); return 0;}    //有一个满足条件,就输出
printf("-1");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划