矩阵取数游戏 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 座 ...
随机推荐
- Directory获取方式
1) FSDirectory.open FSDirectory.open()会以最合适的方式来获取一个Directory对象. 2) RAMDirectory 可以将磁盘中的索引加载到内存中,访问速度 ...
- 《 阿Q正传》-鲁迅 词语解释 | 经典语录
词语解释 “太上有立德,其次是立功,其次是立言,虽久不废,此之谓不朽”.-出自<左传>-左丘明(春秋末期) 解释:(1)最上等的是树立德行,其次是建功立业,再其次是创立学说,即使过了很久也 ...
- 计算1+2+...+100之和<for循环的学习>
#include <stdio.h> /* 计算1+2+....+100 soulsjie 20170525 */ void main(){ int i; int s=0; for(i=0 ...
- 九度oj 题目1190:大整数排序
题目1190:大整数排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4142 解决:1867 题目描述: 对N个长度最长可达到1000的数进行排序. 输入: 输入第一行为一个整数N,( ...
- MySQL中间件之ProxySQL_读写分离/查询重写配置
MySQL中间件之ProxySQL_读写分离/查询重写配置 Posted on 2016-12-25 by mark blue, mark Leave a comment MySQL 1.闲扯几句 读 ...
- 洛谷 U41572 Portal2
U41572 Portal2 题目背景 某地ENLIGHTENED的XM研究所正在研究Portal的处理法则,想要揭示XM能量的来源以及应用XM能量.ENLIGHTENED的首席科学家Jacks发现其 ...
- IE11 文档模式空白
环境描述: win7 64位系统 安装了 更新 IE11-Windows6.1-KB2929437-x64.IE11-Windows6.1-KB3008923-x64 解决方案: 卸载 IE11-Wi ...
- linux 实现VLAN
本文将在一台linux机器上,利用linuxbridge 等技术模拟创建VLAN 环境. 首先,创建vlan interface ip link add link ens33 name ens33.8 ...
- 1076. Forwards on Weibo (30)【树+搜索】——PAT (Advanced Level) Practise
题目信息 1076. Forwards on Weibo (30) 时间限制3000 ms 内存限制65536 kB 代码长度限制16000 B Weibo is known as the Chine ...
- 子元素设置margin-top,父元素也受影响
这个问题困惑了非常久.尽管没有大碍早就摸出来怎么搞定它.但始终不明确原因出在哪里,假设仅仅是IE有问题我也不会太在意.可问题是全部上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事, ...