C - 無料パイHDU - 1176(リバースDP)

彼は突然、たくさんに空からパイをたくさん落ち、空が落ちていないだろうと述べたが、トレイルバックホーム下に一日のゲームボーイ歩きます。セイのゲームボーイ文字が、彼らは彼の横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の最大数までの時間の順序DP [I] [J]代表的結果はDP [0] [5]です。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int dp[100005][25];

int main()
{
    int n;
    while(~scanf("%d",&n) && n)
    {
        int m = 0;
        memset(dp,0,sizeof(dp));
        for(int i = 1;i <= n;i++)
        {
            int x,t;scanf("%d%d",&x,&t);
            m = max(m,t);
            dp[t][x]++;
        }
        
        for(int i = m - 1;i >= 0;i--)
        {
            for(int j = 0;j <= 10;j++)
            {
                dp[i][j] += max(dp[i + 1][j],max(dp[i + 1][j - 1],dp[i + 1][j + 1]));
            }
        }
        
        printf("%d\n",dp[0][5]);
    }
    return 0;
}
公開された676元の記事 ウォン称賛18 ビュー30000 +

おすすめ

転載: blog.csdn.net/tomjobs/article/details/104230307