[動的プログラミングの基礎] デジタル トライアングル (IOI1994)

トピックの説明

数字の三角形
ここに画像の説明を挿入

入力サンプルと出力サンプル

入力例 #1:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

出力例 #1:

30

アイデア:

この質問は一見すると貪欲に見えるかもしれませんが、その後レイヤーごとに判断しますしかし、___ という金額では効果がないようであることがすぐにわかります。なぜなら、おそらく現在の選択は大きいものですが、後ろのものはすべて小さいものだからです。
したがって、現時点では動的プログラミングを使用する必要があります。動的プログラミングの基礎について詳しくは、 「動的プログラミングの基礎 (超詳細)」
を参照してください。

この質問を上から下に進めることはできないので、下から上に処理することを考える必要があります。

まず第一に、状態遷移方程式を知る必要があります。図から、現在の値は、左下隅の数値右下隅の数値の最大値に元の数値
を加えたものであることがわかります。したがって、状態遷移方程式は次のようになります。

dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

次に、 DP の初期値を知る必要があります。その場合、この質問は明らかです。これは入力の最後の行、つまり次のとおりです。

for(int i=1;i<=n;i++) dp[n][i]=a[n][i];

ACコード

最後に、完全なコードを示します。

#include<bits/stdc++.h>
using namespace std;
int n,a[101][101],dp[101][101];
int main(){
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=i;j++) cin>>a[i][j];
	for(int i=1;i<=n;i++) dp[n][i]=a[n][i];
	for(int i=n-1;i>=1;i--){
    
    
		for(int j=1;j<=i;j++){
    
    
			dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
		}
	}
	cout<<dp[1][1];
	return 0;
}

おすすめ

転載: blog.csdn.net/m0_61360607/article/details/132276617