DP(线性专题一)

题意 : 给定三种跳跃方式以及各自的花费, 求终点最小花费

>> face <<

Strategy:DP

状态: dp[i] : 跳跃至第i层的最小花费

边界: 本题无边界是因为开始有多种跳跃方式

转移:

d p [ i ] = m i n ( d p [ i − 1 ] + c o s t [ i ] , d p [ i − 2 ] + c o s t [ i ] , d p [ i − 3 ] + c o s t [ i ] ) dp [i] = min(dp[i - 1] + cost[i], dp[i-2] + cost[i], dp[i - 3] + cost[i]) dp[i]=min(dp[i1]+cost[i],dp[i2]+cost[i],dp[i3]+cost[i])

attention:为了确保i>3 可以是设置偏移量 还有就是终点要min

#include 
#include 
// #define oo INT_MAX
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define ll long long
#define db double
#define eps 0.00001
#define all(x) x.begin(), x.end()
#define met(a, b) memset(a, b, sizeof(a))
#define what_is(x) cerr << #x << " is " << x << endl;
#define lowbit(x) x &(-x)
using namespace std;
using namespace __gnu_pbds;
const int maxn = 1e6 + 9;
const int t = 100;
vector<int> dp(maxn), a(maxn);

int main()
{
	ios::sync_with_stdio(0);
	int n;
	cin >> n;
	_rep(i, 1, n)
	{
		cin >> a[i+t];
	}
	_rep(i, 1 + t, n+t+3){
		dp[i] = min(dp[i - 1] + a[i], min(dp[i - 2] + a[i], dp[i - 3]+a[i]));
		// what_is(dp[i]);
	}
	cout << min(dp[n + t], min(dp[n + 1 + t], dp[n + 2 + t]))<<endl;
}

你可能感兴趣的:(dp,dp)