NOIP2007提高组——矩阵取数游戏(game)

原创 2017年05月09日 16:12:14

题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:

1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

2.每次取走的各个元素只能是该元素所在行的行首或行尾;

3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);

4.游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

输入输出格式

输入文件game.in包括n+1行:

第1行为两个用空格隔开的整数n和m。

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


输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。


数据范围:

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

100%的数据满足:1<=n, m<=80,0<=aij<=1000



【题解】
很明显,行之间是完全没有关系的。所以,对于每一行,可以用Dp来求解。。。
设f[i][j] 为区间i,j内的最大值。则:f[i][j] = max(f[i+1][j] * 2 + f[i][i] , f[i][j-1] * 2 + f[j][j])。
边界条件为f[i][i] = a[i] * 2。也就是说,当只有一个数x的时候,它的得分为x * 2^1 = 2x

但这样做的话,很明显会爆int(大于2^80),所以,还要加一个高精度就可以了。
如果觉得麻烦,可以定义大整数类,和重载运算符之类的。

【程序】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <stack>
using namespace std;
#define Maxn 82
#define Maxm 110

struct Bignum{
	int len;
	int a[Maxm];
	Bignum()
	{
		len = 0;
		memset(a,0,sizeof(a));
	}
};

Bignum ans;
Bignum f[Maxn][Maxn];

int n,m;

Bignum operator +(const Bignum &A,const Bignum &B)
{
	Bignum C;
	C.len = max(A.len , B.len);
	for(int i=1;i<=C.len;i++)
	{
		C.a[i] += A.a[i] + B.a[i];
		if(C.a[i] >= 10)
		{
			C.a[i+1] = 1;
			C.a[i] -= 10;
		}
	}
	if(C.a[C.len+1] > 0) C.len++;
	return C;
}

Bignum Max(const Bignum &A,const Bignum &B)
{
	if(A.len > B.len) return A;
	if(B.len > A.len) return B;
	for(int i=A.len;i>=1;i--) 
		if(A.a[i] > B.a[i]) return A;
		else if(B.a[i] > A.a[i]) return B;
	return A;
}

void GetBignum(Bignum &B,int b)
{
	B.len = 0;
	memset(B.a,0,sizeof(B.a));
	if(!b)
	{
		B.len = 1;
		B.a[1] = 0;
		return ;
	}
	while(b)
	{
		B.len++;
		B.a[B.len] = b%10;
		b/=10;
	}
}

void print(const Bignum &A) { for(int i=A.len;i>=1;i--) printf("%d",A.a[i]); }

int main()
{
	scanf("%d%d",&n,&m);
	
	int x;
	
	for(int j=1;j<=n;j++)
	{
		memset(f,0,sizeof(f));
		
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&x);
			GetBignum(f[i][i],x<<1);
		}
		
		for(int le=1;le<m;le++)
		for(int l=1;l<=m-le;l++)
		{
			int r = l + le;
			f[l][r] = Max(f[l+1][r] + f[l+1][r] + f[l][l] , f[l][r-1] + f[l][r-1] + f[r][r]);
		}
		
		ans = ans + f[1][m];
	}
	
	print(ans);
	
	return 0;
}





版权声明:本文为博主原创文章,转载请注明出处blog.csdn.net/ouqingliang/。 https://blog.csdn.net/ouqingliang/article/details/71480085

NOIP2007矩阵取数游戏

题目来源:https://www.luogu.org/problem/show?pid=1005 dp并不难,f[i][j]表示从i到j的最大得分,f[i][j]=max(f[i+1][j]+a[...
  • moon_sky1999
  • moon_sky1999
  • 2016-11-05 20:41:08
  • 1124

NOIP2007 矩阵取数游戏

3. 矩阵取数游戏 (game.pas/c/cpp) 【问题描述】     帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n*m 的矩阵,矩阵中的每个元素 aij 均 为非负整数。游戏规...
  • hahalidaxin
  • hahalidaxin
  • 2016-03-30 17:22:43
  • 129

NOIP2007 提高组 复赛 game 矩阵取数游戏

NOIP2007 提高组 复赛 game 矩阵取数游戏 1.审题,弄懂样例。 2 3 1 2 3 3 4 2 取数如下:第1次1 2;第2次2 3;第3次3 4。 求和如下:1*2+2*2+2*4...
  • mrcrack
  • mrcrack
  • 2017-06-06 16:43:09
  • 483

wikioi 1166 矩阵取数游戏(2007年NOIP全国联赛提高组)

题目描述 Description 【问题描述】 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数。游戏规则如下: 1. 每次取数...
  • kingzone_2008
  • kingzone_2008
  • 2013-10-11 01:07:43
  • 6651

NOIP2007 提高组 复赛 count 统计数字

NOIP2007 提高组 复赛 count 统计数字 1.题意很快读懂,一开始,想用空间换时间,开个2*10^9+10的数组,但是很快放弃,太消耗空间了。 2.转换成开一个200000+10的结构体数...
  • mrcrack
  • mrcrack
  • 2017-01-02 18:25:21
  • 625

【2007年提高组3】矩阵取数游戏

【2007年提高组3】矩阵取数游戏 Time Limit:10000MS  Memory Limit:65536K Total Submit:10 Accepted:3  Case Time Limi...
  • w00w12l
  • w00w12l
  • 2012-04-27 13:09:43
  • 2954

Noip2007矩阵取数游戏题解

题目描述 Description 【问题描述】 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n∗mn*m 的矩阵,矩阵中的每个元素ai,ja_{i,j}均 为非负整数。游戏规则如下:每次取数...
  • t14t41t
  • t14t41t
  • 2015-05-23 10:52:34
  • 794

NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007

NOIP 提高组 初赛 四、阅读程序写结果 习题集(五)NOIP2006-NOIP2007 1.第十二届(NOIP2006) 问题: 1. //2006.4.1 #include int mai...
  • mrcrack
  • mrcrack
  • 2016-12-19 15:40:27
  • 529

2007年NOIP提高组 统计数字

题目描述 Description 【问题描述】 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数 不超过10000 个,现在需要统计这些自然数...
  • Loi_imcy
  • Loi_imcy
  • 2015-10-11 07:40:35
  • 795

【NOIP2007提高组T3】矩阵取数游戏-动态规划+高精度

【NOIP2007提高组T3】矩阵取数游戏-动态规划+高精度
  • Maxwei_wzj
  • Maxwei_wzj
  • 2016-07-20 19:47:19
  • 364
收藏助手
不良信息举报
您举报文章:NOIP2007提高组——矩阵取数游戏(game)
举报原因:
原因补充:

(最多只允许输入30个字)