ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1029 [NOIP2007]矩阵取数游戏 区间DP

2022-07-12 04:00:07  阅读:168  来源: 互联网

标签:10 NOIP2007 int 矩阵 1029 取数 ch res


链接:https://ac.nowcoder.com/acm/contest/24213/1029
来源:牛客网

题目描述

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

输入描述:

第1行为两个用空格隔开的整数n和m。
第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

输出描述:

输出一个整数,即输入矩阵取数后的最大得分。
示例1

输入

复制
2 3
1 2 3
3 4 2

输出

复制
82

说明

第1次:第1行取行首元素,第2行取行尾元素,本次得分为1 * 2
+ 2 * 2
= 6
第2次:两行均取行首元素,本次得分为2 * 2
+ 3 * 2
2
= 20
第3次:得分为3 * 2+ 4 * 2= 56。 总得分为6 + 20 + 56 = 82 示例2

输入

复制
1 4
4 5 0 5

输出

复制
122
示例3

输入

复制
2 10
96 56 54 46 86 12 23 88 80 43
16 95 18 29 30 53 88 83 64 67

输出

复制
316994

备注:

60%的数据满足:1 ≤ n, m ≤ 30, 答案不超过10
16

100%的数据满足:1 ≤ n, m ≤ 80, 0 ≤ a
ij
 ≤ 1000

分析

由每次从左右两端取数,经过正常思路,将取数过程反过来,就可以用小区间推出大区间的思路求出这道题,可知这题是区间DP

当时写出来过不了看了题解,发现题解写区间DP 的方式很优秀,做个记录

for(int k = 1;k<=m;k++) {
    for(int i = 1,j = k;j<=m;i++,j++) {
        区间dp状态转移
    }
}

 

//-------------------------代码----------------------------
#define LL __int128
#define int LL
const int N = 200;
int n,m;
int a[N][N];
int dp[N][N][N];

LL read() {
LL x = 0,f = 1;
char ch = getchar();
while(ch<'0' || ch > '9'){if(ch =='-')f = -1;ch = getchar();}
while(ch>='0' && ch<='9'){x = x * 10 + ch - '0';ch =getchar();}
return x * f;
}

void print(LL x) {
if( x< 0) { putchar('-');x = -x;}
if( x /10) print(x / 10);
putchar(x % 10 + '0');
}

int qmi(int a,int b) {
int res = 1;
while(b) {
if(b & 1) res = res * a;
b >>= 1;
a = a * a;
}
return res;
}

void solve()
{
n= read(),m = read();
fo(i,1,n) {
fo(j,1,m) {
a[i][j] = read();
}
}
for(int i = 1;i<=n;i++) {
for(int k = 1;k<=m;k++) {
for(int l = 1,r = k;l<=m;r ++ ,l++) {
dp[i][l][r] = max(dp[i][l+1][r] + (LL)a[i][l] * qmi(2,(m-k+1)),dp[i][l][r-1] + a[i][r] * qmi(2,(m-k+1)));
}
}
}
int res = 0;
for(int i = 1;i<=n;i++) {
res += dp[i][1][m];
}
print(res);
}

signed main(){
clapping();TLE;

// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}

/*样例区


*/

//------------------------------------------------------------

标签:10,NOIP2007,int,矩阵,1029,取数,ch,res
来源: https://www.cnblogs.com/er007/p/16468592.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有