TYVJ 矩阵取数 Label:高精度+dp
题目描述
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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个用单个空格隔开的非负整数。
数据范围:
60%的数据满足:1<=n, m<=30,答案不超过10^16
100%的数据满足:1<=n, m<=80,0<=aij<=1000
输出格式:
输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。
输入输出样例
2 3
1 2 3
3 4 2
82
说明
NOIP 2007 提高第三题
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100
using namespace std;
struct bigint{
int a[maxn];//a[0]存位数
bigint(){memset(a,,sizeof(a));} bigint& operator=(const string s){//字符串类的赋值
int k=;
for(int i=s.size()-;i>=;i--){
k++;
this->a[k]=s[i]-'';
}
a[]=s.size();
return *this;
}
bigint& operator=(const int s){
int num=s,i=;
while(num){
i++;
this->a[i]=num%;
num/=;
}
this->a[]=i;
return *this;
} /* bigint& operator=(const bigint &s){
memset(a,0,sizeof(a));
this->a[0]=s.a[0];
for(int i=1;i<=s.a[0];i++){
this->a[i]=s.a[i];
}
return *this;
}*/
//赋值部分结束 //运算符+
bigint operator +(const bigint b){
bigint c;
c.a[]=max(a[],b.a[]);
for(int i=;i<=c.a[];i++){
c.a[i]+=(a[i]+b.a[i]);
c.a[i+]+=c.a[i]/;
c.a[i]%=;
}
if(c.a[c.a[]+]>)
c.a[]++;
return c;
} //比较
/*bool operator <(const bigint b){
if((this->a[0])!=b.a[0]) return (this->a[0])<b.a[0];
for(int i=b.a[0];i>=1;i--){
if((this->a[0])!=b.a[i])
return (this->a[i])<b.a[i];
}
return false;
}*/ bool operator <(const bigint b){
if(this->a[]<b.a[])
return true;
if(this->a[]>b.a[])
return false;
for(int i=b.a[];i>=;i--){
if(this->a[i]!=b.a[i])
return this->a[i]<b.a[i];
}
return false;
}
bool operator >(bigint b){//不可写const,会报错
return b<(*this);
}
}; ostream& operator<<(ostream&out,const bigint a){
for(int i=a.a[];i>=;i--)
out<<a.a[i];
return out;
}
istream& operator>>(istream&in,bigint& a){//不可写const
string s;
in>>s;
a=s;
return in;
} int main(){
int n,m;
cin>>m>>n;
bigint a[];
bigint tot,f[maxn][maxn];
bigint q,p;
for(int num=;num<=m;num++){
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=n;i++)//预处理
f[i][i]=a[i]+a[i]; for(int l=;l<n;l++){
for(int i=;i<=n&&i+l<=n;i++){
int j=i+l;
p=a[i]+f[i+][j];
q=a[j]+f[i][j-];
if(p<q)
f[i][j]=q+q;
else
f[i][j]=p+p;
}
}
tot=f[][n]+tot;
memset(&a,,sizeof(a));//注意&
memset(&f,,sizeof(f));
memset(&q,,sizeof(q));
memset(&p,,sizeof(p));
}
cout<<tot<<endl;
return ;
}注释部分比较函数不可用,待查
就是一个struct版的高精度,抄自http://www.luogu.org/problem/lists
TYVJ 矩阵取数 Label:高精度+dp的更多相关文章
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 矩阵取数问题(dp,高精)
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×mn \times mn×m的矩阵,矩阵中的每个元素ai,ja_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走 ...
- P1005 矩阵取数游戏[区间dp]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...
- [luoguP1005] 矩阵取数游戏(DP + 高精度)
传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...
- TYVJ P1078 删数 Label:区间dp
描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...
- NOIP2007矩阵取数[DP|高精度]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- [LuoguP1005]矩阵取数游戏 (DP+高精度)
题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
随机推荐
- wordpress工作原理
WP初始化的过程:当你输入<yourlink>/wordpress对wordpress进行初始化时,wordpress默认会找根目录下的index.php页面,看一下index.php页面 ...
- ICMP-type对应表
一次在某个防火墙配置策略里看到如下的代码: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A FORWARD -p icmp ...
- 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)
试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...
- What is the difference between provider network and self-service network in OpenStack?
"self-service networking" allows users to create their own virtual networks, subnets, rout ...
- ASP.NET MVC 入门系列教程
ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...
- Android简易数据存储之SharedPreferences
Andorid提供了多种数据存储的方式,例如前面说到的“Android数据存储之SQLite的操作”是用于较复杂的数据存储.然而,如果有些简单的数据存储如果采用SQLite的方式的话会显得比较笨重.例 ...
- 【JAVA、C++】 LeetCode 008 String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- python 将pdf分页后插入至word中
所用技术 1. python编程基础 2. 使用pyPdf 3. 使用python操作word 4. 正则表达式的使用 5. windows的bat编程 下面是一个pyPdf库使用的示例: from ...
- 2.django笔记之缓存,session,cookie,ajax
一.django缓存 1.缓存 缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的: 给定一个url,检查页面是否在缓存中 如果在,返回缓存的页面 否则,生成该页面 ...
- 【python】Python标准库defaultdict模块
来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...