洛谷题解 P1005 【矩阵取数游戏】
这真是一道有趣的题目。 ——垃圾一个
首先,我们知道,有一个
C++11
才有的东西:__int128
,它的上界是\(2^{128}-1\)。
然后,我们知道,有一个叫宏定义的东西,它可以长这样#define int __int128
。
最后,有一个玄学知识,main
函数不仅可以是int
,也可以是signed
。
基础玄学知识介绍完毕。
接下来说说如何\(DP\)。
首先我们仅考虑每一行如何取(具体原因自行看题)。
然后对于每一行,我们仅考虑取头与取尾的\(max\)值(具体原因同上)。
然后定义\(f_{i,j}\)为取区间\([i,j]\)的最大值,定义\(a_i\)为该行第\(i\)个数。
则转移方程为:
\(f_{i,j}=\max{f_{i+1,j}+a_i \times x,f_{i,j-1}+a_j \times x},x\)为题目说的要加的数。
接下来考虑如何降维打击。
你想,如果取的时候先乘上一个2,然后每次遇到一个区间时在乘2,最后效果其实是一样的。
所以\(DP\)式变成:
\(f_{i,j}=\max{2 \times f_{i+1,j}+2 \times a_i,2 \times f_{i,j-1}+2 \times a_j}\)
化简为:
\(f_{i,j}=\max{2 \times (f_{i+1,j}+a_i),2 \times (f_{i,j-1}+a_j)}\)
即核心代码为
int dp(int sum[])
{memset(f,0,sizeof(f));int i,j;for(i=0;i<=m;i++) //i枚举长度,注意,长度可以为0。for(j=1;i+j<=m;j++) //j枚举起点。f[j][i+j]=max(2*(f[j+1][i+j]+sum[j]),2*(f[j][i+j-1]+sum[i+j]));return f[1][m]; //最后所求区间为f[1][m]。
}
然后使用我们的基础玄学知识。
果断CE,没猜错吧?
__int128
不自带输入输出!!!
这里提供快读快写的板子。
最后放个总代码。
#include<bits/stdc++.h>
using namespace std;
#define int __int128
int a[90][90];
int f[90][90];
int n,m;
template<typename T>void qin(T &x)
{x=0;char ch;bool f=0;ch=getchar();while(!isdigit(ch)&&ch!='-') ch=getchar();if(ch=='-') ch=getchar(),f=1;while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();if(f==1) x=-x;
}
void qout(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) qout(x/10);putchar(x%10+'0');
}
int dp(int sum[])
{memset(f,0,sizeof(f));int i,j;for(i=1;i<=m;i++)for(j=1;i+j<=m;j++)f[j][i+j]=max(2*(f[j+1][i+j]+sum[j]),2*(f[j][i+j-1]+sum[i+j]));return f[1][m];
}
int main()
{qin(n),qin(m);int i,j;for(i=1;i<=n;i++)for(j=1;j<=m;j++)qin(a[i][j]);int ans=0;for(i=1;i<=n;i++)ans+=dp(a[i]);qout(ans);return 0;
}
转载于:https://www.cnblogs.com/Garbage-Only-one/p/11436134.html
洛谷题解 P1005 【矩阵取数游戏】相关推荐
- 洛谷P1005 矩阵取数游戏 ACM 大数+区间dp
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 【每日DP】day 10、P1005 矩阵取数游戏【区间DP+高精(python)】难度⭐⭐⭐★
P1005 矩阵取数游戏 输入 2 3 1 2 3 3 4 2 输出 82 说明/提示 NOIP 2007 提高第三题. 数据范围: 60%60\%60% 的数据满足:1≤n,m≤301\le n,m ...
- P1005 矩阵取数游戏(__int128模板/简单dp)
转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j 均为非负整数.游戏规则如下: 每次取数时 ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 矩阵游戏java_矩阵取数游戏JAVA题解
话不多说,先上题目: 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的nm的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: {C}1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩 ...
- 【区间DP+高精】codevs1166 矩阵取数游戏题解
转自: [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 http://blog.csdn.net/ametake/article/details/47664 ...
- 【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解
题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏 ...
- NOIP2007 提高组【矩阵取数游戏】题解
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素a(i,j)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后取完矩阵内所有元素 ...
- 【每日一题】7月10日精讲—矩阵取数游戏
来源:牛客网: 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...
- 【codevs1166】【noip07TG】矩阵取数游戏,新的开始
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [问题描述] 帅帅经 ...
最新文章
- boot loader:Grub
- python程序保存_初识python 文件读取 保存
- beeline执行sql语句_由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考...
- Docker——Docker Compose
- hook xposed 自定义类_【开始学习React Hook(1)】Hook之useState
- JSFL:导入Png图片导出swf
- 在Jetty中设置SSL
- 隐藏导航条HTML,jQuery实现的导航条切换可显示隐藏
- thymealf 高级用法_Thymeleaf
- 再谈节奏与动力---平淡与枯燥的力量
- 底层软件工程师的一次冒险经历
- 【java】javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序【解决方法】
- 树莓派百度语音识别+图灵机器人对话聊天机器人
- 用ADB操纵手机实现连点器(折衷案)
- vue.js中使用甘特图(gantt-elastic)的使用
- (一)双目标定OpenCV读双目摄像头合并图像并分割
- Flutter Convex Bottom 底部导航
- 利用有放回抽样估计自然常数e python
- 【Android】Android外接音源设备之小蜜蜂坑
- 如何登录设备(睿易篇)