当前位置: 首页 > news >正文

【Acwing1027】方格取数(动态规划)题解

题目描述

思路分析

错误思路:

贪心法,先走一次求出最大值,把走过的路上面的数值清零,然后用同样的方法再走一遍求最大值,然后让这两个最大值相加就是最后的结果。

很多人在看到这个题目的时候会有上面的思路,但实践告诉我们,有些数据用上述思路答案是错误的,这是为什么呢?

原因很简单:假设第一次走的时候,有多条路径s1,s2,......可以得到最大值,我们并不知道要选择哪一条,也就是说我们并不知道要把哪一条路上面的数清零,因为不同的选择会对第二次走的结果产生影响!!!

所以要使用其它思路,此处采用动态规划解决

起初,我们很容易想到用四维数组表示状态f[i1][j1][i2][j2]

但其实没有必要,因为我们只需要两条路“同时走”就可以了,也就是说我们可以设置一个维度代表(x,y方向上已经走的路径的和),这个表示为k,那么状态就可以降成三维:f[k][i1][i2]

下面对集合进行划分:

对于f[k][i1][i2],包含四部分:

第一部分是第一条路从上边走过来,第二条路是从上面走过来 f[k-1][i1-1][i2-1]+t

第二部分是第一条路从右边走过来,第二条路是从上面走过来 f[k-1][i1][i2-1]+t

第三部分是第一条路从上边走过来,第二条路是从右面走过来 f[k-1][i1-1][i2]+t

第四部分是第一条路从右边走过来,第二条路是从右面走过来 f[k-1][i1][i2]+t

那么这个t,怎么求,就要看i1和i2是否相同了,因为如果相同的话,再走到这里值已经清空了:

i1==i2   t=w[i1][k-i1]

i1!=i2    t=w[i1][k-i1]+w[i2][k-i2]

最后答案即为:f[n+n][n][n]

#include<iostream>
using namespace std;
const int N=15;
int f[N*2][N][N];
int w[N][N];
int n;
int main()
{scanf("%d",&n);int a,b,c;while(cin>>a>>b>>c,a||b||c)w[a][b]=c;for(int k=2;k<=n*2;k++){for(int i1=1;i1<=n;i1++){for(int i2=1;i2<=n;i2++){int j1=k-i1,j2=k-i2;if(j1>=1&&j1<=n&&j2>=1&&j2<=n){int t=w[i1][j1];if(i1!=i2)t+=w[i2][j2];int &x=f[k][i1][i2];x=max(x,f[k-1][i1-1][i2-1]+t);x=max(x,f[k-1][i1-1][i2]+t);x=max(x,f[k-1][i1][i2-1]+t);x=max(x,f[k-1][i1][i2]+t);}}}}cout<<f[2*n][n][n];return 0;
}

http://www.lryc.cn/news/174332.html

相关文章:

  • 合并区间:解决区间重叠问题的高效算法
  • 万字总结HTML超文本标记语言
  • Java线程池是如何保证核心线程不被销毁的
  • 新课程标准培养学生“高考物理关键能力”的实践研究课题文献综述
  • 急救车工业路由器应用提升急救效率:车联网、数据采集与远程诊疗
  • 【操作系统】聊聊CPU上下文切换实操
  • 【java】【SpringBoot】【四】原理篇 bean、starter、核心原理
  • 【精品资源】Java毕业设计攻略:从选题到答辩,一站式指南
  • 文件高效批量重命名,轻松重命名不同类型的文件名并隐藏编号
  • 接口的定义与实现
  • 浅谈低压绝缘监测及定位系统在海上石油平台的研究与应用
  • Java项目:SSM的食堂点餐系统
  • Linux桌面环境中应用程序无法启动图形交互界面
  • jupyter notebook进不去指定目录怎么办?
  • MySQL 高级(进阶) SQL 语句(二) -----存储过程
  • 机器学习第十三课--主成分分析PCA
  • 钉钉stream机器人-实操详细教程
  • 设计模式:访问者模式(C++实现)
  • Pygame中Sprite的使用方法6-6
  • react多条件查询
  • 2023/09/17
  • Linux centos7压缩包安装mysql-8.0.34 并设置开机自启
  • iOS——present相关属性以及dismiss多级的方法
  • MinDoc v0.4:轻量级文档在线管理系统
  • Appium 全新 2.0 全新跨平台生态,版本特性抢鲜体验!
  • Opencv 4.5.5 linux contrib编译
  • Windows 11 家庭中文版添加本地安全策略
  • TCP三次握手四次挥手
  • C语言基础-结构体
  • Codeforces Round 848 (Div. 2)C