17.11.4 矩阵取数游戏

描述
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n行*m列的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下: 
1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素; 
2. 每次取走的各个元素只能是该元素所在行的行首或行尾; 
3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*i,其中i表示第i次取数(从1开始编号); 
4. 游戏结束总得分为m次取数得分之和。 
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
 
关于输入
包括n+1行; 
第一行为两个用空格隔开的整数n和m。 
第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开 

l<=n,m<=80,1<=aij<=1000
 
关于输出
仅包含1行,为一个整数,即输入矩阵取数后的最大的分。
 
例子输入
2 3

1 2 3
3 4 2
例子输出
34
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n, m,a,b,sumlin=0,summax=0;
 6     cin >> n >> m;
 7     int max[81][81],num[81];
 8     for(int lin=1;lin<=n;lin++)
 9     {
10         for (int col = 1; col <= m; col++)
11             cin >> num[col];
12         for(int j=0;j<=m;j++)
13         for (int i = 0; i <= m - j; i++)
14         {
15             if (i == 0 && j == 0)
16                 max[i][j] = 0;
17             else if (i == 1 && j == 0)
18                 max[i][j] = num[1];
19             else if (i == 0 && j == 1)
20                 max[i][j] = num[m];
21             else
22             {
23                 if (i >= 1)
24                     a = max[i - 1][j] + num[i] * (i + j);
25                 else
26                     a = 0;
27                 if (j >= 1)
28                     b = max[i][j - 1] + num[m-j+1] * (i + j);
29                 else
30                     b = 0;
31                 max[i][j] = (((a) > (b)) ? (a) : (b));
32             }
33         }
34         sumlin = 0;
35         for (int i = 0; i <= m; i++)
36         {
37             if (max[i][m - i] > sumlin)
38                 sumlin = max[i][m - i];
39         }
40         summax += sumlin;
41     }
42     cout << summax << endl;
43     return 0;
44 }
View Code

小生第一次做dp类型的题……更不用说是区间dp了。

花了一个多小时去学习编写以及debug

debug的时候发现反而低级错误更多...

把n和m搞反……以及循环中忘记初始化值

还是要冷静

转载于:https://www.cnblogs.com/yalphait/p/7782681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值