单足跳
Description
游戲在一行N個(gè)方塊中進(jìn)行,編號(hào)為1到N,一開始Alice在方塊1中,第一次只能跳到方塊2中,接下來(lái)每一次跳躍必須滿足以下兩個(gè)限制:
(1) 如果是向前跳(即跳到比現(xiàn)在編號(hào)大的方塊),跳躍距離必須比上一次要大1;
(2) 如果是向后跳(即跳到比現(xiàn)在編號(hào)小的方塊),跳躍距離必須跟上一次一樣。
例如,第一次跳躍后,Alice可以跳回1也可以跳到4。
每進(jìn)入一個(gè)方塊,Alice必須支付一定的費(fèi)用,Alice的目標(biāo)花最少的錢從方塊1跳到方塊N。編程計(jì)算最小的花費(fèi)。
Input
第一行包含一個(gè)整數(shù)N(2<=N<=1000),表示方塊的個(gè)數(shù)。
接下來(lái)N行,每行包含一個(gè)不超過(guò)500的正整數(shù)表示進(jìn)入該方塊的費(fèi)用。
Output
輸出Alice跳到N的最小花費(fèi)。
Sample Input
輸入1:
6
1
2
3
4
5
6
輸入2:
8
2
3
4
3
1
6
1
4
Sample Output
輸出1:
12
輸出2:
14
Data Constraint
Hint
【樣例解釋】
樣例1中,在跳到2后,Alice選擇跳回1,再跳到3然后再跳到6。
.
.
.
.
.
.
分析
設(shè)f[i,j]表示花費(fèi)i次跳躍走到j(luò)格。
那么轉(zhuǎn)移就是向前和向后。
往前的情況:
我們會(huì)到達(dá)j-i這個(gè)位置,根據(jù)題目意思,花費(fèi)i步過(guò)去
f[i][j-i]=min(f[i][j-i],f[i][j]+v[j-i]);
往后的情況:
我們會(huì)往后跳i+1位,即到達(dá)j+i+1這個(gè)位置,他是花費(fèi)i+1步過(guò)去
if (f[i][j]<2147483647) f[i+1][i+j+1]=f[i][j]+v[i+j+1];
.
.
.
.
.
.
程序:
#include<iostream> using namespace std; long long f[1001][1001],ans=2147483647; int n,v[1500]; int main() {cin>>n;for (int i=1;i<=n;i++)cin>>v[i];for (int i=0;i<=n;i++)for (int j=0;j<=n;j++)f[i][j]=2147483647;f[1][2]=v[2];for (int i=1;i<=n-1;i++){for (int j=n;j>=i+1;j--)f[i][j-i]=min(f[i][j-i],f[i][j]+v[j-i]);for (int j=1;j<=n-1;j++)if (f[i][j]<2147483647) f[i+1][i+j+1]=f[i][j]+v[i+j+1];}for (int i=1;i<=n;i++)ans=min(ans,f[i][n]);cout<<ans;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499944.html
總結(jié)