描述 | |
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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
|
|
例子输出 | |
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 }
小生第一次做dp类型的题……更不用说是区间dp了。
花了一个多小时去学习编写以及debug
debug的时候发现反而低级错误更多...
把n和m搞反……以及循环中忘记初始化值
还是要冷静