シンプルな動的なプログラミングB - 無料パイ(冬季訓練)

トピックス要件
HDU-1176は、
突然たくさんに空からパイをたくさん落ち、空が落ちていないだろうと述べたが、トレイルバックホーム下に一日のゲームボーイ歩きます。セイのゲームボーイ文字が、彼らは彼の横10メートルの範囲内で、このパイが出て他の場所ではありませんが、素晴らしいです。もちろん、地上のうちパイは、食べていない場合は、そうゲームボーイすぐに迎えにバッグ本体を削除します。道の両側には立つことができないので、しかし、ので、彼は唯一のコースを取ることができます。古いゲームボーイは、通常ゲームで軽快マスターは、実際には動きが特に遅い神経である、とだけ毎秒モバイルでパイを落下キャッチする1メートルの範囲を超えていないものの、ゲームをプレイするために部屋に滞在したよう。アイコンの座標として今トレイル:

ここに画像を挿入説明
問題を簡単にするために、時間の次の期間にパイ0-10 11の位置を下降させると仮定する。ゲームボーイはこの5の冒頭に位置するので、第一、第二に立って、彼はパイの位置で唯一の三つの位置4,5,6を受けました。Qのゲームボーイはパイの数まで取ることができますか?(彼のバックパックを仮定すると、パイの無限の数を保持することができる)
入力
、入力データを複数組を。正の整数N(0 <N <100000)へのデータの各セットの最初の行 、 あるは、N本の経路上にパイを表します。N接合行ダウン、各行は二つの整数X、T(0 <T <有し 100000)、 ショーの点xにおけるオフT秒のパイ。同じポイントで同じ第二は、より多くのパイを落ちることがあります。n = 0で、入力端。
出力
出力の一つの行に対応する入力データの各セットの。出力整数m、mはゲームボーイがパイに取ることができ表します。
ヒント:大規模よりも、この質問にデータを入力し、タイムアウトすることがありCINと、scanf関数で読み推奨。

入力サンプル
。6
。5. 1
4 1
6 1
7 2
。7 2
。8. 3
0
出力例
4
動的プログラミング対象は、主に動的式、三点間の最大値の選択を取得し、蓄積し、その後、このプロセスを繰り返しますdp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]))

#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int dp[150000][20];
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        int i,j,t,x,sum=0;
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
        {
            scanf("%d %d",&x,&t);
            dp[t][x+1]++;
            sum=max(sum,t);
        }
        for(i=sum-1;i>=0;i--)
            for(j=14;j>=0;j--)
            dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
        printf("%d\n",dp[0][6]);
    }
    return 0;
}
公開された38元の記事 ウォン称賛27 ビュー3167

おすすめ

転載: blog.csdn.net/qq_45891413/article/details/105257456