【b703】矩阵取数游戏
Time Limit: 1 second
Memory Limit: 50 MB
【问题描述】
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素;
2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*2i,其中i表示第i次取数(从1开始编号);
4. 游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
【输入】
包括n+1行;
第一行为两个用空格隔开的整数n和m。
第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开
【输出】
仅包含1行,为一个整数,即输入矩阵取数后的最大的分。
【输入样例1】
2 3
1 2 3
3 4 2
【输出样例1】
82
【输入输出样例1解释】
第1次:第一行取行首元素,第二行取行尾元素,本次的氛围1*21+2*21=6
第2次:两行均取行首元素,本次得分为2*22+3*22=20
第3次:得分为3*23+4*23=56。总得分为6+20+56=82
【输入样例2】
1 4
4 5 0 5
【输出样例2】
122
【输入样例3】
2 10
96 56 54 46 86 12 23 88 80 43
16 95 18 29 30 53 88 83 64 67
【输出样例3】
316994
【 限制】
60%的数据满足:1<=n, m<=30,答案不超过1016
100%的数据满足:1<=n, m<=80,0<=aij<=1000
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=b703
【题意】
中文题
【题解】
这道题可以分成n个步骤;
即每一行与每一行之间是独立的;
所以我们可以一行一行地进行处理;
设
f[i][j]表示取当前行区间[i..j]内的数能够获得的最大值;
则
f[i][j] = 2*max(a[i]+f[i+1][j],f[i][j-1]+a[j]);
这里的2对外层的区间乘的次数比较少,对内层的区间里的数乘得比较多;
且从内到外是递增1的;
正符合题目的要求;
写一个记忆化搜索就好了;
因为数据比较大;
要写一个高精度;
。。。
挺麻烦的。
(一开始那个a数组没有init调了很久。。做高精度加法的时候要注意啊,不然之前的数据会保留下来的。。)
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXM = 110;
struct bignum
{
int a[110],len;
void init()
{
rep1(i,1,100)
a[i] = 0;
}
};
int n,m;
bignum f[MAXM][MAXM],emp,a[MAXM],ans;
bignum plu(bignum a,bignum b)
{
bignum c;
rep1(i,1,100)
c.a[i] = 0;
c.len = max(a.len,b.len);
int x = 0;
rep1(i,1,c.len)
{
c.a[i] = c.a[i] + a.a[i]+b.a[i] + x;
x = c.a[i]/10;
c.a[i] %= 10;
}
while (x>0)
{
c.a[++c.len] = x;
x = c.a[c.len]/10;
c.a[c.len]%=10;
}
return c;
}
bignum ma(bignum a,bignum b)
{
int len1 = a.len,len2 = b.len;
if (len1>len2)
return a;
else
if (len1<len2)
return b;
rep2(i,len1,1)
if (a.a[i]!=b.a[i])
{
if (a.a[i]>b.a[i])
return a;
else
return b;
}
return a;
}
bignum dfs(int l,int r)
{
if (l>r) return emp;
if (f[l][r].a[1]!=-1)
return f[l][r];
if (l==r)
return plu(a[l],a[l]);
//f[l][r] = 2*max(a[l]+dfs(l+1,r),dfs(l,r-1)+a[r]);
bignum temp1 = plu(a[l],dfs(l+1,r));
bignum temp2 = plu(dfs(l,r-1),a[r]);
bignum temp3 = ma(temp1,temp2);
return f[l][r] = plu(temp3,temp3);
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
ans.len = 1;ans.a[1] =0;ans.init();
emp.a[1] = 0,emp.len = 1;
emp.init();
rei(n);rei(m);
rep1(i,1,n)
{
rep1(ii,1,m)
rep1(jj,1,m)
{
f[ii][jj].init();
f[ii][jj].len = 1;
f[ii][jj].a[1] = -1;
}
rep1(j,1,m)
{
int temp,len=0;
rei(temp);
a[j].init();
while (temp>0)
{
a[j].a[++len] = temp%10;
temp/=10;
}
if (len==0)
{
a[j].a[1] = 0;
a[j].len = 1;
}
else
a[j].len = len;
}
ans=plu(ans,dfs(1,m));
}
rep2(i,ans.len,1)
printf("%d",ans.a[i]);
return 0;
}
【b703】矩阵取数游戏的更多相关文章
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- codevs1166 矩阵取数游戏
题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- AC日记——矩阵取数游戏 洛谷 P1005
矩阵取数游戏 思路: dp+高精: 代码: #include <bits/stdc++.h> using namespace std; #define ll long long struc ...
- 【洛谷P1005】矩阵取数游戏
矩阵取数游戏 题目链接 每行分别跑一趟区间DP即可 这道题区间DP是非常裸的,按套路来即可 但是很毒瘤的是需要高精度, “我王境泽就是爆零,从这跳下去,也不会用__int128的!” #include ...
随机推荐
- POJ3889Fractal Streets
Fractal Streets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 445 Accepted: 162 Des ...
- system_service进程里 调用SystemManager.getService("activity") 直接返回ams的引用?
我们知道ActivityManager是运行在system_service进程里的,但是最近看代码发现在这个进程的其他服务线程里为了获取AMS调用: ActivityManagerService am ...
- op应用:官方,wifidog,portal,uci,luci,脚本,框架,usb
http://wiki.openwrt.org/doc/starthttp://downloads.openwrt.org/docs/buildroot-documentation.htmlhttp: ...
- 【51NOD1028】大数乘法 V2
╰( ̄▽ ̄)╭ 给出2个大整数A,B,计算A*B的结果. (A,B的长度 <= 100000,A,B >= 0) (⊙ ▽ ⊙) 把大整数A看做一个次数界为lenA的多项式A(x),其中x ...
- [idea]idea配置tomcat 标签: tomcatidea 2017-03-12 22:12 402人阅读 评论(19)
我们在使用idea的时候,一定会遇到的一步,就是使用tomcat来发布我们的项目,那么,如何在idea中设置tomcat呢?下面就随小编来一起学习一下吧. 设置tomcat 打开设置界面 Run-&g ...
- More Effective C++: 03异常
C++的异常机制使得程序付出某些代价:资源泄漏的可能性增加了:写出具有你希望的行为的构造函数与析构函数变得更加困难:执行程序和库程序尺寸增加了,同时运行速度降低了等等. 但是为什么使用异常呢?C程序使 ...
- compass与css sprite(雪碧图)
什么是css sprite? css sprite,中文叫雪碧图,也有人喊CSS精灵,就是一种背景拼合的技术,然后通过background-position来显示雪碧图中需要显示的图像. MDN相关链 ...
- 【JZOJ4877】【NOIP2016提高A组集训第10场11.8】力场护盾
题目描述 ZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安. 在实验 ...
- KiCad 5.1.0 镜像圆弧后错位问题
KiCad 5.1.0 镜像圆弧后错位问题 看官方回复这个问题将在 5.1.3 进行修复,因为这段时间在举行 KiCon 活动. 看到这个问题并不是非常严重,不是致命的,所以已经从 5.1.0 跳到 ...
- 为什么不喜欢在 QQ 群里回答问题?
为什么不喜欢在 QQ 群里回答问题? 没有主题,主题随时都在变. 回答后无法备份,当然自己有心可以总结一下. 实时性要求太强,可能回答但是突然有事离开,再回头看已经是 几十条的留言. QQ 群用来闲聊 ...