其他分享
首页 > 其他分享> > 1029 [NOIP2007]矩阵取数游戏 区间DP

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

作者:互联网

链接: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