华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1136|回复: 2
打印 上一主题 下一主题

P1004 方格取数

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-7-4 23:34:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目描述
设有N×N 的方格图 (N≤9) ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0 。如下图所示(见样例):

A
0  0  0  0  0  0  0  0
0  0 13  0  0  6  0  0
0  0  0  0  7  0  0  0
0  0  0 14  0  0  0  0
0 21  0  0  0  4  0  0
0  0 15  0  0  0  0  0
0 14  0  0  0  0  0  0
0  0  0  0  0  0  0  0
                         B
某人从图的左上角的 A点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0 )。
此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。

输入输出格式
输入格式:
输入的第一行为一个整数 N (表示 N×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 0 表示输入结束。

输出格式:
只需输出一个整数,表示 2条路径上取得的最大的和。

输入输出样例
输入样例#1:
8
2 3 13
2 6  6
3 5  7
4 4 14
5 2 21
5 6  4
6 3 15
7 2 14
0 0  0
输出样例#1:
67
说明
NOIP 2000 提高组第四题
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2018-7-22 11:56:43 | 只看该作者
此题很有意思,是数字三角形的变形。
第一步,假设只有一条路怎么做,是不是数字三角形做两次?
第二部,增加的这条路,是不是可以看做在另外一个数字三角形?
做出题目固然重要但是思维的方法更重要,大家好好体会。
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-9-30 19:49:36 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. const int M=11;
  4. int a[M][M],n,f[M+M][M][M],s,ans;
  5. bool flag;
  6. int main()
  7. {
  8.     cin>>n;
  9.     int o,b,c;
  10.     cin>>o>>b>>c;
  11.     while(o || b || c)
  12.     {
  13.         a[o][b]=c;
  14.         cin>>o>>b>>c;
  15.     }
  16.     f[2][1][1]=a[1][1];
  17.     for(int i=3;i<n+n;i++)
  18.         for(int j=1;j<i-1;j++)
  19.             for(int k=j+1;k<=i-1;k++)
  20.             {
  21.                 flag=0;
  22.                 s=f[i][j][k];
  23.                 if(f[i-1][j-1][k-1]>s)
  24.                 {
  25.                     s=f[i-1][j-1][k-1];
  26.                     flag=true;
  27.                 }
  28.                 if(f[i-1][j][k-1]>s)
  29.                 {
  30.                     s=f[i-1][j][k-1];
  31.                     flag=true;
  32.                 }
  33.                 if(f[i-1][j-1][k]>s)
  34.                 {
  35.                     s=f[i-1][j-1][k];
  36.                     flag=true;
  37.                 }
  38.                 if(f[i-1][j][k]>s)
  39.                 {
  40.                     s=f[i-1][j][k];
  41.                     flag=true;
  42.                 }
  43.                 f[i][j][k]=s+a[i-j][j]+a[i-k][k];
  44.             }
  45.     ans=f[n+n-1][n-1][n]+a[n][n];
  46.     cout<<ans<<endl;
  47.     return 0;
  48. }

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:43 , Processed in 0.104377 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表