dp入门题
题目:https://www.luogu.org/problemnew/show/2800
- 先说一下思路:一共有3种方式来到达当前这层
- 第一种直接从i-1层到达i;
- 第二种是从i-2层跳一次再使用法力(跳一层)到达当前这层;
- 第三种是从i-3层跳一次再使用法力(跳二层)到达当前这层;
- 于是转移方程就出来了
- f[i]=min(min(f[i-1]+v[i],f[i-2]+a[i-1]),f[i-3]+a[i-2]);
#include<iostream> #include<cstdio> #include<cstdlib> const int MAXN=10000300; using namespace std; int n,v[MAXN],f[MAXN]; int main() { //freopen("2800.in","r",stdin); //reopen("2800.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&v[i+3]); } for(int i=4;i<=n+3;i++)//为了避免Re循环改了一下 { f[i]=min(min(f[i-3]+v[i-2],f[i-2]+v[i-1]),f[i-1]+v[i]); } printf("%d",f[n+3]); return 0; }