4.比赛F

题目链接:http://acm.hust.edu.cn/vjudge/contest/126362#problem/F

比赛的时候没有图,也没有看群消息,看到这题自己臆想出了一种走法。。。说明看题真的很重要,不要先入为主,主观臆测!!!!这题是一个数字三角形的问题,麻烦一点的是倒过来求,但弄清楚怎么走也很简单了。。感觉这个有点类似dijkstra 算法。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 250
int d[N][N],a[N][N];
int main()
{
    int t,n,m;
    int c=1;
    scanf("%d",&t);
    while(t--)
    {
        memset(d,0,sizeof(d));
        memset(a,0,sizeof(a));
        scanf("%d",&n);
        m=2*n-1;
        for(int i=1;i<=m;i++)//输入
        {
            if(i<=n)
            {
                for(int j=1;j<=i;j++)
                scanf("%d",&d[i][j]);
            }
            else
            {
                for(int j=1;j<=(2*n-i);j++)//多写几个数 就找出规律了
                 scanf("%d",&d[i][j]);
            }
        }
        a[1][1]=d[1][1];//从d[1][1] 开始
        for(int i=2;i<=n;i++)
            for(int j=1;j<=i;j++)
            {
                if(j==1)
                    a[i][j]=d[i][j]+a[i-1][j];
                else if(j==i)
                    a[i][j]=d[i][j]+a[i-1][j-1];
                else
                    a[i][j]=d[i][j]+max(a[i-1][j-1],a[i-1][j]);
            }
            for(int i=n+1;i<=m;i++)
                for(int j=1;j<=2*n-i;j++)
                 a[i][j]=d[i][j]+max(a[i-1][j],a[i-1][j+1]);
                printf("Case %d: ",c);
                 printf("%d
",a[m][1]);
                 c++;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Twsc/p/5744427.html