洛谷P1004
洛谷P1004方格取数
题目大意
本题简要意思就是一个人从一个数字矩阵的左上角走到右下角,只能向下和向右走,拿完的数对应位置变成0,并且这个人要走两次,需要计算两次所拿数的最大值
Train of thought
本题和数字三角形十分类似,只不过要走两次,我们可以考虑用dp的方式解决问题
动态规划的关键是状态表示和递推方程
如果我们这里和数字三角形一样采用二维的dp方式,我们还需要找到所有第一次走的解,并且还要保存,然后在第一次解的角度上解析第二次走的收益
如图所示:
如果这样做的话时间复杂度可能是指数级别的,可能会超时
所以我们这里选择利用四维数组储存两次走的状态,f[i][j][k][l]表示第一次走到(k,l),第二次走到(i,j)时所能得到的最大收益。
这里没有区分次序,对于可能出现的重复拿数的问题,我们需要把这个数减去
< if(i == k && j ==l) f[i][j][k][l] -= Square[i][j];>
递推方程显然为max(f[i-1][j][k-1][l],f[i - 1][j][k][l - 1],f[i][j- 1][k- 1][l],f[i][j-1][k][l-1])
也就是< f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i - 1][j][k][l - 1]), max(f[i][j - 1][k - 1][l],f[i][j - 1][k][l - 1])) + Square[i][j] + Square[k][l];>
Time complexity
输入时最多有92个数,处理时要处理94次,所以总的时间复杂度为94+92次
综上所述,代码如下:
#include<iostream>
#include<utility>
using namespace std;
typedef long long ll;
#define fi(a,b) for(int i = a; i <= b; ++i)
#define fr(a,b) for(int i = a; i >= b; --i)
using pii = pair<int,int>;
int Square[10][10];
int f[10][10][10][10];//数组表示的状态数
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
int a,b,c;
while(cin >> a >> b >> c && a && b && c)
Square[a][b] = c;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n ; ++j)
for(int k = 1; k <= n; ++k)
for(int l = 1; l <= n; ++l)
{
f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i - 1][j][k][l - 1]), max(f[i][j - 1][k - 1][l],f[i][j - 1][k][l - 1])) + Square[i][j] + Square[k][l];
if(i == k && j ==l) f[i][j][k][l] -= Square[i][j];//避免重复拿数
}
cout << f[n][n][n][n] << endl;
return 0;
}
感谢大家的阅读,如果觉得还不错就点个赞吧ヾ(≧▽≦*)o
洛谷P1004的更多相关文章
- 洛谷 P1004 方格取数 【多进程dp】
题目链接:https://www.luogu.org/problemnew/show/P1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 ...
- 洛谷 - P1004 - 方格取数 - 简单dp
https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- 洛谷 P1004 方格取数 题解
P1004 方格取数 题目描述 设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\).如下图所示(见样例): ...
- 洛谷 P1004 方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 方格取数洛谷p1004
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 【动态规划】洛谷P1004方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 洛谷P1004 方格取数-四维DP
题目描述 设有 N \times NN×N 的方格图 (N \le 9)(N≤9) ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00 .如下图所示(见样例): A 0 0 0 0 0 ...
- 四维动规 洛谷P1004方格取数
分析:这个题因为数据量非常小,可以直接用四维的DP数组 dp[i][j][k][l]表示第一个人走到位置(i,j),第二个人走到位置[k][l]时所取的数的最大和 状态转移方程可以轻松得出为:dp[i ...
- AC日记——方格取数 洛谷 P1004
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
随机推荐
- 关于DDD和COLA的一些总结和思考
写在前面: 其实之前一直想汇总一篇关于自己对于面向对象的思考以及实践的文章,但是苦于自己的"墨迹",一延再延,最近机缘巧合下仔细了解了一下COLA的内容,这个想法再次被勾起,所以这 ...
- uniapp底层跨端原理
uniapp底层跨端原理 - 代码编写:开发者使用Vue.js框架编写uniapp的代码,包括页面结构.样式和逻辑等. - 编译过程:在编译过程中,uniapp会将Vue.js的代码转换为各个平台所需 ...
- 【WPF】自定义数据集合绑定到UI界面
需要展示列表项,从https://github.com/jdscodelab/File-Manager-UI-Wpf这个项目,只有前端UI. 复用了其文件内容列表 主要源码: <StackP ...
- CSS操作——背景属性
1.background-color(背景颜色) 页面的背景颜色有四种属性值表示,分别是transparent(透明),RGB十进制颜色表示,十六进制颜色表示和颜色单词表示. 属性使用: /* bac ...
- Android 11(R) MultiMedia(十五)MediaCodec同步模式实现一个简易播放器
这一节是实践,学习android原生SimplePlayer并自己码一遍,果然学到很多. MyPlayer.h #include <media/stagefright/foundation/AH ...
- WPF多显示器问题 - WindowState
标签 wpf multiple-monitors 一段时间以来,我一直试图让我的 WPF 应用程序跨越多个监视器,并且几乎可以正常工作.当我设置以下行时,问题似乎出现了: win1.WindowSta ...
- 使用rem、动态vh自适应移动端
前言 这是我的 模仿抖音 系列文章的第六篇 第一篇:200行代码实现类似Swiper.js的轮播组件 第二篇:实现抖音 "视频无限滑动"效果 第三篇:Vue 路由使用介绍以及添加转 ...
- vscode开发一个luaIDE插件
基础知识 环境准备 node.js 下载后下一步下一步即可安装成功,推荐LTS版本 yeoman 脚手架工具,也就是快速帮你新建一个插件所需的目录的工具,在工作目录下cmd,输入下列命令即可安装 np ...
- js随机数 比较运算符
// 生成一个随机数 1 - 100 范围内的随机数 // 大家先记住 JavaScript 生成随机数值的 公式 // 如果要 生成 a - b 范围内的数值 ...
- JS注释 JS变量
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...