【USACOデジタルデルタ] [IOI1994数三角形
タイトル説明
次の番号のピラミッドを見てください。
最後に最高点からユニットのどこでも、そして最大の数字を通るパスの末尾をパスを見つけるためのプログラムを書きます。各ステップはまた、右下のポイントに到達することができます左下のポイントに行くことができます。
7
3 8
8 1 0
7. 4 4 2
4 5 6 2.5
上記の実施例において、経路7→3→8→7→ 5は、 最大値を生成します
入力形式
正の整数r最初の行は、行の数を表します。
この特定のデジタル回線の行動の背後にある各ピラミッドは、整数が含まれています。
出力フォーマット
一行は、最大かつ取得する可能性が含まれています。
サンプル入力と出力
入力#1レプリケーション
。5
。7
。3. 8
。8 1 0
2 7 4 4
4 5 6 2. 5
出力#1の複製
30
説明/ヒント
[データ]の範囲
のデータの100%、1≤r≤1000、範囲[0,100]内のすべての入力に。
NOCOWからタイトル変換。
USACOトレーニングセクション1.5
IOI1994 Day1T1
分析
これは、バックパックにD [1005] [1005]データ記憶、DP [1005] [1005]で、ナップサック問題として見ることができます。。
私たちは、それぞれが行くことができる方法のサンプル、または右下のすぐ下にあるある、に依存している三角形の左側としてこれを参照してください。
私たちは、ボトムアップからの視点を変え、中央DPでどこかがそれの上にあることから来ることができる、それはまた、上から来ることができ、左、そして我々は両方のケースに最大のDP値を加えた上でdの値をとりますすることができる:
DP [I] [J] = MAX(DP [I-1] [J-1]]、DP [I-1]〜[J])+ D [i]は[J]
別の場合には、必ずしもそれだけ上、この場合のみ、より陽性であることを意味しており、左端にされている
DP [I] [J] = DP [I-1] [j]は[I + D ] [J]。
最後に、考慮してください。一番下の行が一度に到達することができ、)(その後、各要求の最大、最大値を一緒に行くために誰が知りませんでした
最大値OKに最終的な出力、保存それぞれの最大。。。。。。。。
コード
#include<iostream>
#include<cstring>
using namespace std;
int n;
int d[1005][1005];
int dp[1005][1005];
int main(){
cin>>n;
//memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>d[i][j];
}
}
int maxn=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j==1){
dp[i][j] = dp[i-1][j]+ d[i][j];
}else{
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]) +d[i][j];
}
maxn = max(maxn,dp[i][j]);
}
}
cout<<maxn<<endl;
return 0;
}