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/。

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
  • 374

NOIP2007提高组 矩阵取数

NOIP2007提高组 矩阵取数 题目描述     帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:     1.每次取数时须从每...
  • earnMoney
  • earnMoney
  • 2017年09月23日 00:43
  • 57

NOIP2007 矩阵取数游戏

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

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
  • 928

【NOIP2007】矩阵取数游戏

1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description ...
  • Loi_Shirley
  • Loi_Shirley
  • 2016年11月15日 08:41
  • 363

NOIP2007【矩阵取数游戏】

Description 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素,共n个。m次...
  • Woodstock_Cyber
  • Woodstock_Cyber
  • 2016年10月30日 14:54
  • 1634

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

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

矩阵取数游戏

题目描述 Description 【问题描述】 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数。游戏规则如下: 1. 每次取数时须从每行各...
  • sinat_34943123
  • sinat_34943123
  • 2016年09月10日 16:44
  • 1186

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小。 先上题目 题目描述 Description 【问题描述】 帅帅经常跟同学玩...
  • ametake
  • ametake
  • 2015年08月14日 18:11
  • 3282

noip2007矩阵取数游戏 2008.11.5

noip2007矩阵取数游戏 2008.11.5 注意:比大小位数不相同时,取位数大的数大;当位数相同时,要从最高位开始比较,相同,则往下比,不相同,则大的数就大。(我刚开始,弄成了从最低位开始比较...
  • Batman_
  • Batman_
  • 2016年02月05日 13:06
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NOIP2007提高组——矩阵取数游戏(game)
举报原因:
原因补充:

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