トピックの説明
数字の三角形
入力サンプルと出力サンプル
入力例 #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;
}