矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)
矩阵取数游戏
2007年NOIP全国联赛提高组
【问题描述】
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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*21+2*21=6
第2 次:两行均取行首元素,本次得分为2*22+3*22=20
第3 次:得分为3*23+4*23=56。总得分为6+20+56=82
【限制】
60%的数据满足:1<=n, m<=30, 答案不超过1016
100%的数据满足:1<=n, m<=80, 0<=aij<=1000
/*
高精 恶心的我啊!
终于大概差不懂几乎弄懂了封装怎么压位
就是那个高精*低精调不出来,只能写高精*高精+压位
注意输出时先输出第一个然后再setfill setw时压几位就是几
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iomanip> #define N 81
#define ll long long
#define mod 10000 using namespace std;
ll n,m,k,cnt,flag;
ll a[N][N]; inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} class Big{ public: int size,num[]; Big(){size=;memset(num,,sizeof num);}
Big(int data)
{
size=;
while(data!=){num[++size]=data%mod;data/=mod;}
}
inline void init(int data)
{
size=;
while(data!=){num[++size]=data%mod;data/=mod;}
}
inline void copy(Big A)
{
int s1=size,s2=A.size;size=s2;
for(int i=s2;i>=;i--) num[i]=A.num[i];
} };
Big f[N][N],Pow[N];
Big ans; ostream & operator << (ostream & os,Big A)
{
int s=A.size;
if(s==) os<<,flag=;
if(!flag)
{
os<<A.num[s];
for(int i=s-;i;i--) os<<setfill('')<<setw()<<A.num[i];
return os;
}
} Big operator + (Big A,Big B)
{
Big c;
int s=max(A.size,B.size);
c.size=s;
for(int i=;i<=s;i++) c.num[i]=A.num[i]+B.num[i];
for(int i=;i<=s;i++)
if(c.num[i]>=mod)
{
c.num[i+]+=c.num[i]/mod;
c.num[i]%=mod;
}
if(c.num[s+]!=) c.size++;
return c;
} Big operator * (Big A,Big B)
{
Big c;
int s1=A.size,s2=B.size;
for(int i=;i<=s1;i++)
for(int j=;j<=s2;j++)
{
c.num[i+j-]+=A.num[i]*B.num[j];
c.num[i+j]+=c.num[i+j-]/mod;
c.num[i+j-]%=mod;
}
c.size=A.size+B.size;
while(c.num[c.size]==) c.size--;
return c;
} bool operator > (Big A,Big B)
{
int s1=A.size,s2=B.size;
if(s1<s2) return ;
if(s1>s2) return ;
for(int i=s1;i>=;i--)
if(A.num[i]<B.num[i]) return ;
else if(A.num[i]>B.num[i]) return ;
return ;
} Big Cmax(Big A,Big B)
{
if(A>B) return A;
else return B;
} int main()
{
n=read();m=read();
for(int i=;i<=n;i++) for(int j=;j<=m;j++)
a[i][j]=read();
memset(Pow,,sizeof Pow);
Pow[].init();
for(int i=;i<=m;i++)
Pow[i].copy(*Pow[i-]);
for(int i=;i<=n;i++)
{
memset(f,,sizeof f);
for(int j=;j<=m;j++)
f[j][].copy(a[i][j]*Pow[m]);
for(int k=;k<=m;k++)
for(int j=;j<=m-k+;j++)
f[j][k].copy(Cmax(f[j][k-]+a[i][j+k-]*Pow[m-k+],f[j+][k-]+a[i][j]*Pow[m-k+])); ans.copy(ans+f[][m]);
}
cout<<ans;
return ;
}
矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)的更多相关文章
- 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成 ...
- Codevs 1198 国王游戏 2012年NOIP全国联赛提高组
1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...
- 树网的核 2007年NOIP全国联赛提高组(floyed)
树网的核 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述]设 T= ...
- 3285 转圈游戏 2013年NOIP全国联赛提高组
3285 转圈游戏 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description n 个小伙伴 ...
- 統計數字(2007年NOIP全国联赛提高组)
题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现的 ...
- 1043 方格取数 2000年NOIP全国联赛提高组
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N* ...
- 1143 纪念品分组 2007年NOIP全国联赛普及组
1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Descri ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
随机推荐
- 【Codeforces 1031C】Cram Time
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 如果找到最大的n使得1+2+...+n<=a+b 然后第一天输出1,2.3,4....t1 这里1+2+..+t1<=a 这还远远 ...
- Webdriver元素定位3(CSS)
Selenium极力推荐使用CSS 定位,而不是XPath来定位元素,原因是CSS 定位比XPath 定速度快,语法也更加简洁. CSS常用定位方法 选择器 例子 描述 .class .intro c ...
- 博客搬迁至Gitcafe
原先的Github pages貌似在国内被墙了,导致搜索引擎一直没有索引到,今天一怒之下迁到Gitcafe 虽然之前的模板用不成,害我重新找了一套,改了好半天,不过总算弄完了
- openjudge1944 吃糖果
描述名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0).妈妈告诉名名每天可以吃一块或者两块巧克力.假设名名每天都吃巧克力,问名名共有多 ...
- AjaxFileUpload文件上传组件(php+jQuery+ajax)
jQuery插件AjaxFileUpload可以实现ajax文件上传,下载地址:http://www.phpletter.com/contents/ajaxfileupload/ajaxfileupl ...
- [bzoj1014][JSOI2008]火星人prefix_非旋转Treap_hash_二分
火星人prefix bzoj-1014 JSOI-2004 题目大意:给定一个字符串,支持三种操作:1.查询:两个后缀之间的$LCP$:2.单点修改:3.插入一个字符. 注释:$1\le n\le 1 ...
- 02-js变量学习
<html> <head> <title>js的变量学习</title> <meta charset="UTF-8"/> ...
- Django学习系列之模板
什么是django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签) 模板通常用于产生HTML 如何使用模板 创建一个Tem ...
- golang中关闭http server
golange 开启http server 服务之后,怎么关闭呢? ------------------------------------------------------------------ ...
- bzoj3190【JLOI2013】赛车
3190: [JLOI2013]赛车 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1445 Solved: 454 [Submit][Statu ...