動的計画——デジタル三角形の最適解と最適経路を求める


Description
n行の数字からなる数値三角形を下図に示す.与えられたn行の数字からなるデジタル三角形について,三角形の頂部から底部までの経路が通る数値和の最大値を計算するアルゴリズムを設計してみた.注意:i番目のレイヤのj番目の数字について、その経路の次の数字は、i+1番目のレイヤのj番目またはj+1番目の数字のみである.
Input
1行目はデジタル三角形の行数n,1≦n≦100である.次にn行は、数値三角形の各行の数値(整数)である.すべての数字は0です.99の間.
Output
出力には2行あります.三角形の上から下までの最適パスに含まれる要素を出力し、同じ最適解があれば左のパスを優先的に出力します.エレメント間はスペースで区切られ、最後のエレメントの後ろにもスペースがあります.
Sample Input
5 
7 
3 8 
8 1 0  
2 7 4 4 
4 5 2 6 5

Sample Output
7 3 8 7 5 

簡単な動的計画問題は,記入法で下から上へ遡ると最大の和を求めることができる.さらに上から下へ、最適なパスに含まれる要素を見つけます.
最適値を求めることについて:
a[][]は入力の配列であり、下から1として初期化nをピラミッド層数として下から上へ計算する再帰式:a[i-1][j]+=max(a[i][j],a[i][j+1])1何も言うことはありません.直接コードをつけます.
#include
#include 
using namespace std;

int main(){
	int n;
	int a[105][105];
	int b[105][105];
	cin>>n;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=i; j++){
			cin>>a[i][j];
			b[i][j]=a[i][j];
		}
	}
	
	for(int i=n-1; i>=1; i--){
		for(int j=n-1; j>=1; j--){
			b[i][j] += max(b[i+1][j], b[i+1][j+1]);
		}
	}
	
	int k=1;
	for(int i=1; i<=n; i++){
	 	cout<