http://www.rqnoj.cn/Problem_82.html
一、思路
最后跳至塔顶有三种可能
1、从 i-1 直接跳至
2、从i-2 直接跳至
3、从i-1 爬至
那在i-1,i-2能不能爬
所以定义f(i, 0) f(i, 1) 来描述到第i层处最快
f[i][0] = f[i-1][1]>f[i-2][1] ? f[i-2][1] : f[i-1][1];//从i-1或者i-2处跳至,取两者最小值
f[i][1] = f[i-1][0] + a[i-1]; //f[i][1] 从i-1,0 处爬至,
f[i][1] = f[i][1]>f[i-1][1]+a[i-1] ? f[i-1][1]+a[i-1] : f[i][1];//或者i-1,1处爬至
二、算法
1、读入n
2、读入每层高度
3、三重循环动态规划求解
4、输出结果
取 f[n+1][0] 与 f[n+1][1]的最小值
1 2 3 4 5 6 取楼基为1, 楼顶为6
代码如下
AC
#include <iostream.h>
int main()
{
int f[10002][2] = {0};
int a[10001];
int i, j, k, n;
//读入n
cin>>n;
//读入每个n
for (i=1; i<=n; i++)
{
cin>>a[i];
}
//动态规划求解
f[1][0] = 0;
f[1][1] = 0;
f[2][0] = f[1][1];
f[2][1] = f[1][1] + a[1];
for (i=3; i<=n+1; i++)
{
f[i][0] = f[i-1][1]>f[i-2][1] ? f[i-2][1] : f[i-1][1];
f[i][1] = f[i-1][0] + a[i-1];
f[i][1] = f[i][1]>f[i-1][1]+a[i-1] ? f[i-1][1]+a[i-1] : f[i][1];
}
//输出结果
int result = f[n+1][1]>f[n+1][0] ? f[n+1][0] : f[n+1][1];
cout<<result;
return 0;
}