マジカルガール(ダイナミックプログラミング)

ディスカッションエリア
マジカルガール
制限時間:1000ミリ秒|メモリ制限:65535 KB
難易度:3
説明
数日前、徐元玄のジュクシアンマドカは本当に火がついていました。Hei Changzhi(Xiaoyan)が魔女の夜と戦うために階段を上ったとき、彼女は問題に遭遇し、あなたの助けを求めました。魔女の夜が宙に浮いたため、階段を上る必要がありました。廃墟にはn階があり、各階の高さが異なっていたため、シャオヤンは各階に登るのに異なる時間を要しました。しかしもちろん、シャオヤンは時間の魔法を知っており、1つまたは2つのレイヤーを瞬時に飛ぶことができます[つまり、時間はかかりません]。しかし、テレポートするたびに、テレポートを再び使用する前に、少なくとももう1つのレイヤーを登る必要がありました(この時点で魔法の力を追加します)。Xiaoyanが各ユニットの高さを登るのに1秒かかります。魔女の夜をなくすことが急務なので、シャオヤンはあなたに彼女が建物の頂上に到達するための最短時間で計画を見つけるのを手伝ってほしいと思っています。
入力
この質問には複数のデータセットがあり、ファイル入力で終わります。
データの各グループの最初の行にある番号N(1 <= N <= 10000)は、フロアの数を表します。
次のN行では、各行に番号H(1 <= H <= 100)があり、これはこのレイヤーの高さを表します。
出力
データのグループごとに、建物の最上部に到達するのに必要な最短時間を表す1行の数値Sを出力します。
サンプル入力
5
3
5
1
8
4
サンプル出力
1

#include<iostream>
using namespace std;
int h[10005];
int dp[10005][2];

int main() {
  //1表示飞
  //0表示不飞 
  int layers;
  while (cin >> layers) {
    for (int i = 1; i <= layers; i++) {
      cin >> h[i];
    }
    dp[1][1] = 0;
    dp[1][0] = h[1];
    dp[2][1] = 0;
    dp[2][0] = h[2];
    for (int i = 3; i <= layers; i++) {
      dp[i][0] = min(dp[i - 1][1], dp[i - 1][0]) + h[i];
      dp[i][1] = min(dp[i - 2][0], dp[i - 1][0]);
    }
    cout << min(dp[layers][0], dp[layers][1]) << endl;
  }
  return 0;
}

おすすめ

転載: blog.csdn.net/ZWHSOUL/article/details/83014767