[NOIP2007] 提高组 洛谷P1005 矩阵取数游戏
题目描述
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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 提高第三题
可以看出每一行都是独立的问题。
对于每一行都做一次区间DP,最后累加各行答案即可。
需要用到高精度。
不考虑高精度的话,方程很好推:
k和g是区间两端点
long long tmp=2*max(f[k+1][g]+a[k],f[k][g-1]+a[g]);
f[k][g]=max(f[k][g],tmp);
by sdfzrlt
加上高精以后:
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct bnum{
int len;
int a[];
}f[][];
bnum cn;
void Print(bnum ans){
printf("%d",ans.a[ans.len]);
for(int i=ans.len-;i>;i--){
printf("%d",ans.a[i]/);
printf("%d",ans.a[i]/%);
printf("%d",ans.a[i]%);
}
printf("\n");
return;
}
bnum pls(bnum a,bnum b){
cn.len=max(a.len,b.len);
memset(cn.a,,sizeof cn.a);
for(int i=;i<=cn.len;i++){
cn.a[i]=cn.a[i]+a.a[i]+b.a[i];
cn.a[i+]+=cn.a[i]/;
cn.a[i]%=;
}
while(cn.a[cn.len+]>)cn.len++;
return cn;
} bnum ans;
bool cmp(bnum a,bnum b){
if(a.len!=b.len){
if(a.len<b.len)return ;
else return ;
}
for(int i=a.len;i>;i--){
if(a.a[i]<b.a[i])return ;
if(a.a[i]==b.a[i])continue;
return ;
}
return ;
}
//int f[90][90];
int n,m;
int w[];
int main(){
n=read();m=read();
int i,j;
while(n--){
// memset(f,0,sizeof f);
for(i=;i<=m;++i)w[i]=read();
for(i=;i<=m;++i){
f[i][i].len=;
f[i][i].a[]=w[i]*;
}
for(int st=;st<=m;st++){
for(i=;i<=m-st+;i++){
j=i+st-;
bnum tmp={};
tmp.len=;tmp.a[]=w[i];
bnum t1=pls(tmp,f[i+][j]); tmp.len=;tmp.a[]=w[j];
bnum t2=pls(tmp,f[i][j-]); if(cmp(t1,t2)){
f[i][j]=pls(t2,t2);
}
else f[i][j]=pls(t1,t1);
// f[i][j]=2*max(f[i+1][j]+w[i],f[i][j-1]+w[j]);
}
}
ans=pls(ans,f[][m]);
// Print(ans);
}
Print(ans);
return ;
}
[NOIP2007] 提高组 洛谷P1005 矩阵取数游戏的更多相关文章
- 洛谷P1005 矩阵取数游戏
P1005 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次 ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 洛谷 P1005 矩阵取数游戏 (区间dp+高精度)
这道题大部分时间都在弄高精度-- 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的 ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- P1005 矩阵取数游戏[区间dp]
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...
- 【洛谷P1288】取数游戏II
取数游戏II 题目链接 显然,由于一定有一个0,我们可以求出从初始点到0的链的长度 若有一条链长为奇数,则先手可以每次取完一条边上所有的数, 后手只能取另一条边的数,先手必胜: 反之若没有奇数链,后手 ...
- [NOIP2007] 提高组 洛谷P1098 字符串的展开
题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数 ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- [NOIP2007] 提高组 洛谷P1097 统计数字
题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...
随机推荐
- 移动端UI自动化Appium测试——Appium server两种启动方式
执行自动化测试之前,需要先运行appium server,这样才能形成server与java client的通信,启动server有两种方式,一种是命令,一种是按钮图标,具体使用如下: 1.用命令启动 ...
- AJPFX分析int 和integer的区别
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
- VUE学习,is 特性,转载来源:https://segmentfault.com/q/1010000007205176/
- JS filters-table简单过滤-Version 1
初级版本: 输入框可检索,空格检索忽略 radio点击后会过滤 最后的两个输入框可根据age范围检索过滤 三个单独的功能,不能协同工作 <!DOCTYPE html> <html&g ...
- Boost库编译安装
一.Boost库介绍 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其 ...
- bat copy
@echo off regedit /s %~dp0regedit.reg //注册注册表xcopy "D: ...
- 面向UI编程思想
UI编程思想: 模块化+组合 模块化是分解: 组合是合成: https://www.cnblogs.com/feng9exe/p/11044134.html
- JVM优化(上)
02.我们为什么要对jvm做优化: 1.标准参数:-help-version 2. -X参数(非标) -Xint-Xcomp -Xint : interpreted-Xcomp: complied ...
- 新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”
新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”, 其主要原因是文件夹的权限问题,手动将项目文件夹权限更改为可读可写就OK,具体操 ...
- c语言中的 strcpy和strncpy字符串函数使用介绍
1.strcpy函数 函数原型:char *strcpy(char *dst,char const *src) 必须保证dst字符的空间足以保存src字符,否则多余的字符仍然被复 ...