Description
一座长度为n的桥,起点的一端坐标为0,且在整数坐标i处有a[i]个石头【0<=a[i]<=4】, 一只青蛙从坐标0处开始起跳,一步可以跳的距离为1或2或3【即每一步都会落在整数点处】, 青蛙落在i处会踩着该点的所有石头,求青蛙跳出这座桥最少踩多少个石头?
Input
第一行整数n(<=150),接着下一行会有n+1个由空格隔开的整数,即桥上各个坐标处石头数量。
Output
输出踩着最少石头个数
Sample Input
10
1 2 1 3 0 3 1 2 1 1 2
Sample Output
4
HINT
样例答案的解释:踩着坐标 0,2,4,6,8 的石头,共4块
这也是道简单的动态规划题……但是考试的时候脑子有点短路,傻了。。。
首先用数组a[]来记录石头个数。
因为最后一个是必须要跳的,所以我们从后往前回溯,dp[i]来记录从a[n]跳到a[i]的石头个数。
首先 dp[n-1]=a[n-1]+0; dp[n-2]=a[n-2]+0; dp[n-3]=a[n-3]+0;
当0<=i<=n-4: dp[i] = min(dp[i+1], dp[i+2], dp[i+3]) + a[i]
最优解:dp[0]
好的我们直接上代码:
#include<iostream>
using namespace std;
int main(){
int n;
int a[155];
cin>>n;
for(int i=0; i<=n; i++){
cin>>a[i];
}
int dp[155];
dp[n-1]=a[n-1];
dp[n-2]=a[n-2];
dp[n-3]=a[n-3];
for(int i=n-4; i>=0; i--){
dp[i]=min(min(dp[i+1], dp[i+2]), dp[i+3])+a[i];
}
cout<<dp[0];
}