【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]

cpp 复制代码
#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;
}
相关推荐
B站_计算机毕业设计之家37 分钟前
python电商商品评论数据分析可视化系统 爬虫 数据采集 Flask框架 NLP情感分析 LDA主题分析 Bayes评论分类(源码) ✅
大数据·hadoop·爬虫·python·算法·数据分析·1024程序员节
小白菜又菜1 小时前
Leetcode 1518. Water Bottles
算法·leetcode·职场和发展
长存祈月心1 小时前
Rust Option 与 Result深度解析
算法
杭州杭州杭州2 小时前
机器学习(3)---线性算法,决策树,神经网络,支持向量机
算法·决策树·机器学习
星竹晨L3 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
9ilk3 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
不语n3 小时前
快速排序(Quick Sort)详解与图解
数据结构·算法·排序算法·快速排序·双指针排序
恒者走天下3 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++
电鱼智能的电小鱼4 小时前
基于电鱼 ARM 工控机的AI视频智能分析方案:让传统监控变得更聪明
网络·arm开发·人工智能·嵌入式硬件·算法·音视频