您的位置:首页 > 其它

lightOj 1004 数塔

2016-01-17 16:46 465 查看
题目大意:类似于数塔,求在一个菱形里每行选一个数的最大值。。。。选的数据必须相邻,,具体看题目

思路:每个状态都有上一行的状态决定,当前位置在上一行的位置的基础上选一个最大值即可。。

#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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: