nyoj1204
魔法少女
時間限制:1000 ms | 內(nèi)存限制:65535 KB
難度:3
描述
前些時間虛淵玄的巨獻小圓著實火了一把。 在黑長直(小炎)往上爬樓去對抗魔女之夜時,她遇到了一個問題想請你幫忙。 因為魔女之夜是懸浮在半空的,所以她必須要爬樓,而那座廢墟一共有n層,而且每層高度不同,這造成小炎爬每層的時間也不同。不過當然,小炎會時間魔法,可以瞬間飛過一層或者兩層[即不耗時]。但每次瞬移的時候她都必須要至少往上再爬一層(在這個當兒補充魔力)才能再次使用瞬移。爬每單位高度需要消耗小炎1秒時間。 消滅魔女之夜是刻不容緩的,所以小炎想找你幫她找出一種最短時間方案能通往樓頂。
輸入
本題有多組數(shù)據(jù),以文件輸入結(jié)尾結(jié)束。
每組數(shù)據(jù)第一行一個數(shù)字N(1 <= N <= 10000),代表樓層數(shù)量。
接下去N行,每行一個數(shù)字H(1 <= H <= 100),代表本層的高度。
輸出
對于每組數(shù)據(jù),輸出一行,一個數(shù)字S,代表通往樓頂所需的最短時間。
樣例輸入
5
3
5
1
8
4
樣例輸出
1
WA(始終沒想通錯在哪里。。。):
#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 10010; const int inf = 65535; int n,H[maxn]; int dp[maxn][3];//dp[i][0]表示爬到第i樓;dp[i][1]表示飛過一層到i樓;dp[i][2]表示飛過兩層到i樓int main() { while(scanf("%d",&n)!=EOF) { for(int i = 1; i <= n; i++) scanf("%d",&H[i]); dp[0][0] = 0; dp[1][0] = H[1]; dp[1][1] = 0; dp[1][2] = inf; dp[2][0] = min(dp[1][0]+H[2],dp[1][1]+H[2]); dp[2][1] = H[2]; dp[2][2] = 0; if(n == 3) { printf("%d\n",min(H[1],min(H[2],H[3]))); continue; } for(int i = 3; i <= n; i++) { dp[i][0] = min(dp[i-1][0],dp[i-1][2]) + H[i]; if(dp[i-1][1] != dp[i-2][1]) //判斷狀態(tài)是否可行,即保證只能夠連續(xù)飛兩層 dp[i][0] = min(dp[i][0],dp[i-1][1]+H[i]); dp[i][1] = dp[i-1][0]; //同上 if(dp[i-1][1] != dp[i-2][1]) dp[i][1] = min(dp[i][1],dp[i-1][1]); dp[i][2] = dp[i-2][0]; } printf("%d\n",min(dp[n][0],min(dp[n][1],dp[n][2]))); } return 0; }AC(別人的代碼):
#include<bits/stdc++.h> using namespace std; const int maxn = 10005; int dp[maxn][2]; int a[maxn]; int main() {int n ;while(scanf("%d",&n)!=EOF){memset(dp,0,sizeof(dp));for( int i = 1; i <= n; i++){scanf("%d", &a[i]);}dp[1][0]=0;dp[2][0]=0;dp[2][1]=a[2];dp[1][1]=a[1];for(int i = 3; i <= n; i++){dp[i][0] = min(dp[i-2][1],dp[i-1][1]);dp[i][1] = min(dp[i-2][0]+a[i-1]+a[i],min(dp[i-1][0]+a[i],min(dp[i-2][1]+a[i],dp[i-1][1]+a[i])));}printf("%d\n",min(dp[n][0],dp[n][1]));}return 0; }總結(jié)
- 上一篇: JEECG 商业版本最近新增什么功能啦?
- 下一篇: nyoj 211 (Floyd算法求传递