POJ 1163

数字塔,非常舒服的DP,自底向上的递归搜索填表,非常归整

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;

const int maxn= 105;

int tow[maxn][maxn];
int dv[maxn][maxn];

int main(int argc, char const *argv[])
{
	int n;
	scanf("%d", &n);
	for (int i= 1; i<= n; ++i){
		for (int j= 1; j<= i; ++j){
			scanf("%d", tow[i]+j);
		}
	}
	memset(dv, -1, sizeof(dv));

	dv[0][1]= 0;
	for (int i= 1; i<= n; ++i){
		dv[i][1]= dv[i-1][1]+tow[i][1];
	}

	for (int i= 2; i<= n; ++i){
		dv[i][i]= dv[i-1][i-1]+tow[i][i];
	}

	for (int i= 3; i<= n; ++i){
		for (int j= 2; j< i; ++j){
			dv[i][j]= max(dv[i-1][j-1], dv[i-1][j])+tow[i][j];
		}
	}

	int ans= -1;
	for (int i= 1; i<= n; ++i){
		ans= max(ans, dv[n][i]);
	}

	printf("%d\n", ans);
	return 0;
}
posted @ 2021-04-26 22:30  IdiotNe  阅读(31)  评论(0编辑  收藏  举报