题目大意:类似于数塔,求在一个菱形里每行选一个数的最大值。。。。选的数据必须相邻,,具体看题目
思路:每个状态都有上一行的状态决定,当前位置在上一行的位置的基础上选一个最大值即可。。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
#define maxn 105
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define INF 1000000000
LL arr[maxn][maxn];
LL dp[maxn];
int main()
{
int t , k = 1;
scanf("%d" , &t);
while(t--)
{
int n;
scanf("%d" , &n);
int up = 2 * n - 1;
mem(arr , 0);
for(int i = 1 ; i <= up ; i ++)
{
int tmp = i;
if(i > n) tmp = n - (i - n);
for(int j = 1 ; j <= tmp ; j ++)
{
scanf("%lld" , &arr[i][j]);
}
}
int flag = 0;
for(int i = 2 ; i <= up ; i ++)
{
int tmp = i;
if(i > n) {flag = 1;tmp = n - (i - n);}
for(int j = 1 ; j <= tmp ; j ++)
{
if(!flag) arr[i][j] += max(arr[i-1][j] , arr[i-1][j-1]);
else arr[i][j] += max(arr[i-1][j] , arr[i-1][j+1]);
}
}
printf("Case %d: %lld\n" , k++ , arr[up][1]);
}
}