tyvj数字三角形

P1044数字三角形

描述

示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
  每一步可沿左斜线向下或右斜线向下走;
  1<三角形行数<25;
  三角形中的数字为整数<1000;

输入格式

第一行为N,表示有N行
后面N行表示三角形每条路的路径权

输出格式

路径所经过的数字的总和最大的答案

测试样例1

输入



3 8 
8 1 0 
2 7 4 4 
4 5 2 6 5

输出

30
 复制过来自配边框下划线我也是醉了。。。。
动归的题目,貌似很经典很基础~我是从下往上每次取最大的然后加成和,最后(1,1)所在的便是最大路径和。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 1000
using namespace std;
int a[MAXN][MAXN], b[MAXN][MAXN]; //a用来存原数组,b用来存和
int main()
{
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=i; j++)    //因为是三角形的所以j<=i;
        {
            scanf("%d", &a[i][j]);
        }
    }
    for(int i=1; i<=n; i++)
    {
        b[n][i] = a[n][i];
    }
    for(int i=n-1; i>=1; i--)
    {
        for(int j=1; j<=i; j++)
        {
            if(b[i+1][j+1] > b[i+1][j])
            {
                b[i][j] = b[i+1][j+1] + a[i][j]; //注意加上原数组的值 
            }
            else
                b[i][j] = b[i+1][j] + a[i][j];
        }
    }
    printf("%d", b[1][1]);
    return 0;
}

P1076数字三角形2

描述

数字三角形
要求走到最后mod 100最大

输入格式

第1行n,表示n行 <=25
第2到n+1行为每个的权值

输出格式

mod 100最大值

测试样例1

输入



99 98

输出

99
默默地说。。有一种被嵌套的赶脚。。。。

 其实就只有这个没太看懂题目,简短有力啊,都把我整蒙了。。。直接贴代码好了。。。
 
#include <stdio.h>
int map[30][30], N, max = 0, M[30][30];
int dfs(int n, int m, int add)
{
	int i, j;
	if(n == N)
        {
		if(max < add % 100)
			max = add % 100;
	}
	else if(n < N)
	{

		dfs(n + 1, m, add + map[n][m]);
		dfs(n + 1, m + 1, add + map[n][m]);
	}
}
int main()
{
	int i, j;
	scanf("%d", &N);
	for(i = 0; i < N; i++)
        {
		for(j = 0; j < i + 1; j++)
			scanf("%d", &map[i][j]);
	}
	dfs(0, 0, 0);
	printf("%d\n", max);
	return 0;
}

P1079数字三角形3

描述

数字三角形必须经过某一个点,使之走的路程和最大

输入格式

第1行n,表示n行 <=25
第2到n+1行为每个的权值
程序必须经过n div 2,n div 2这个点

输出格式

最大值

测试样例1

输入



1 1

输出

2
 做了数字三角形1之后,这道就很好做啦,只要想一想三角形和必经过的一点之间的关系,把经过点的  
 
 下面缩小成一个小三角形就ok啦

 eg:4行的三角形   (2,2)点为必须经过的,即下面红色的数字~三角形里面紫色的部分就是经过2后

        可以取到的数字,而绿色的就是必须要取到的才能经过2~
  
形成的三角形:                        数组中的储存状况:

                1                               1
            1       2                           1     2
       1       2       3                      1     2     3
  1       2       3        4                 1     2     3     4


 代码:

 
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 1000
using namespace std;
int a[MAXN][MAXN], b[MAXN][MAXN];   //a存原始三角形 , b存和
int main()
{
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=i; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for(int i=n; i>=1; i--)        
    {
        b[n][i] = a[n][i];
    }
    for(int i=n-1; i>=n/2; i--)        //注意必经过的点是n/2,
    {
        for(int j=n/2; j<=i; j++)
        {
            if(b[i+1][j+1] > b[i+1][j])
            {
                b[i][j] = b[i+1][j+1] + a[i][j];
            }
            else
                b[i][j] = b[i+1][j] + a[i][j];
        }
    }
    for(int i=n/2-1; i>=1; i--)
    {
        b[i][i] = b[i+1][i+1] + a[i][i];
    }
    printf("%d\n", b[1][1]);
    return 0;
}

P1084数字三角形4

描述

数字三角形必须经过某一个点,使之走的路程和最大

输入格式

第1行n,表示n行 <=25
第2到n+1行为每个的权值
第n+2行为两个数x,y表示必须经过的点

输出格式

最大值

测试样例1

输入



1 1 
1 1

输出

2
 和上面的差不太多,就是需要考虑上下分别用动归~

 代码:

 
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 1000
using namespace std;
int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
int main()
{
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=i; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    int x, y;
    scanf("%d%d", &x, &y);
    for(int i=n; i>=x; i--)               //下三角
    {
        for(int j=1; j<=i; j++)
        {
            b[i][j] = max(b[i+1][j], b[i+1][j+1]) + a[i][j];
        }
    }
    for(int i=1; i<=x; i++)              //上三角
    {
        for(int j=1; j<=i; j++)
        {
            c[i][j] = max(c[i-1][j], c[i-1][j-1]) + a[i][j];
        }
    }
    int result = b[x][y] + c[x][y] - a[x][y];    //这个a[x][y]加了两次,要减掉~
    printf("%d\n", result);
    return 0;
}

 对了~~Merry Christmas!!!   *<<<<+  
 
 >_<  嘻嘻 ~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值