1277:【例9.21】方格取数

2023-12-18 14:15
文章标签 1277 取数 方格 9.21

本文主要是介绍1277:【例9.21】方格取数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【算法分析】
 动态规划:坐标型动规
1. 状态定义
阶段:第一趟走到的位置(i,j)与第二趟走到的位置(k,l)
决策:第一趟如何走,同时第二趟如何走
策略:第一趟从(1,1)走到(i,j),第二趟从(1,1)走到(k,l)的路径。
策略集合:第一趟从(1,1)走到(i,j),第二趟从(1,1)走到(k,l)的所有路径方案。
条件:取到的数字加和最大
统计量:数字加和
状态定义:dp[i][j][k][l]:第一趟从(1,1)走到(i,j),第二趟从(1,1)走到(k,l)取到的数字加和最大的路径方案的数字加和。

2. 状态转移方程
记:a[i][j]为(i,j)位置的数字。
分割集合:从(1,1)走到(i,j),再从(1,1)走到(k,l)的路径方案
由于每次只能向右或下走,那么第一趟走到(i,j)前,只可能在(i,j)上面一格(i-1,j)或左侧一格(i,j-1)。同理,第二趟走到(k,l)前,只可能在(k-1,l)或(k,l-1)。
因此,第一趟到达(i,j)前的位置与第二趟到达(k,l)前的位置就有4种组合:

(i-1,j)与(k-1,l)
(i,j-1)与(k-1,l)
(i-1,j)与(k,l-1)
(i,j-1)与(k,l-1)
先求出第一趟到达(i,j)前的位置与第二趟到达(k,l)前的位置的路线上的数字加和,如果(i,j)与(k,l)不是同一位置,就加上a[i][j]与a[k][l],否则只加上a[i][j],即为第一趟到达(i,j)与第二趟到达(k,l)的路线上是数字加和。多种情况求最大值。
详细情况如下:
如果如果(i,j)与(k,l)是同一位置:

第一趟到达(i-1,j)后到达(i,j),第二趟到达(k-1,l)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i-1][j][k-1][l]+a[i][j]
第一趟到达(i,j-1)后到达(i,j),第二趟到达(k-1,l)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i][j-1][k-1][l]+a[i][j]
第一趟到达(i-1,j)后到达(i,j),第二趟到达(k,l-1)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i-1][j][k][l-1]+a[i][j]
第一趟到达(i,j-1)后到达(i,j),第二趟到达(k,l-1)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i][j-1][k][l-1]+a[i][j]
以上四种情况取最大值。
如果(i,j)与(k,l)不是同一位置:

第一趟到达(i-1,j)后到达(i,j),第二趟到达(k-1,l)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i-1][j][k-1][l]+a[i][j]+a[k][l]
第一趟到达(i,j-1)后到达(i,j),第二趟到达(k-1,l)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i][j-1][k-1][l]+a[i][j]+a[k][l]
第一趟到达(i-1,j)后到达(i,j),第二趟到达(k,l-1)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i-1][j][k][l-1]+a[i][j]+a[k][l]
第一趟到达(i,j-1)后到达(i,j),第二趟到达(k,l-1)后到达(k,l),数字加和为dp[i][j][k][l]=dp[i][j-1][k][l-1]+a[i][j]+a[k][l]
以上四种情况取最大值。


【参考代码】
 

#include <bits/stdc++.h>
using namespace std;
#define N 11
int dp[N][N][N][N], a[N][N];//dp[i][j][k][l]:第一趟从(1,1)走到(i,j),第二趟从(1,1)走到(k,l)取到的数字加和最大的方案的数字加和。
int main()
{int n, l, r, v;//l:行 r:列 v:值cin >> n;while(cin >> l >> r >> v) {if(l == 0 && r == 0 && v == 0)break;a[l][r] = v;       }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){if(k == i && l == j)//如果是同一位置 dp[i][j][k][l] = max(max(dp[i-1][j][k-1][l], dp[i-1][j][k][l-1]), max(dp[i][j-1][k-1][l], dp[i][j-1][k][l-1])) + a[i][j];else//如果不是同一位置 dp[i][j][k][l] = max(max(dp[i-1][j][k-1][l], dp[i-1][j][k][l-1]), max(dp[i][j-1][k-1][l], dp[i][j-1][k][l-1])) + a[i][j] + a[k][l];       }cout << dp[n][n][n][n];return 0;
}

这篇关于1277:【例9.21】方格取数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508702

相关文章

蓝桥杯第八届 方格分割(dfs)

标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。   观察可得他是一个中心对称图形,我们只需要搜索它的对称线即可。我们可以把对称线抽象为从(

[Algorithm][综合训练][小葱的01串][小红的ABC][不相邻取数]详细讲解

目录 1.小葱的01串1.题目链接2.算法原理详解 && 代码实现 2.小红的ABC1.题目链接2.算法原理详解 && 代码实现 3.不相邻取数1.题目链接2.算法原理详解 && 代码实现 1.小葱的01串 1.题目链接 小葱的01串 2.算法原理详解 && 代码实现 解法:滑动窗口 --> ⻓度固定的滑动窗⼝,要想符合要求,必定是⼀半⼀半的 选择区域的时候,仅需

Unity实现棋盘方格

本文参考:p1_哔哩哔哩_bilibili  一、精要提炼 1、Button自带的白色底图是圆角的,Image组件自带的白色底图是方角的。 2、2D中Instantiate指定的位置为屏幕坐标系的位置,左下角为(0,0) 3、求某个组件的位置:xx.transform.position,xx为GameObject对象 4、求某个组件的width:xx.getComponent<RectT

寒假第五天--递推递归--骨牌铺方格

骨牌铺方格 Time Limit: 1000MS Memory limit: 32768K 题目描述 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: 输入 输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。

SDUTOJ 1018 骨牌铺方格 递推

题目描述 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: 输入 输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。 输出 对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。 示例输入 132

2.1 数字方格

1749:数字方格 描述 如上图,有3个方格,每个方格里面都有一个整数a1,a2,a3。已知0 <= a1, a2, a3 <= n,而且a1 + a2是2的倍数,a2 + a3是3的倍数, a1 + a2 + a3是5的倍数。你的任务是找到一组a1,a2,a3,使得a1 + a2 + a3最大。 输入 一行,包含一个整数n (0 <= n <= 100)。 输出 一个整数,即a1

zzuli 1894 (985的方格难题)

dp   985的方格难题 Description 985走入了一个n * n的方格地图,他已经知道其中有一个格子是坏的。现在他要从(1, 1)走到(n, n),每次只可以向下或者向右走一步,问他能否到达(n,n)。若不能到达输出-1,反之输出到达(n,n)的方案数。 Input 第一行输入一个整数t,代表有t组测试数据。 每组数据第一行输入三个整数n,x,

Ural 1277 cops ans thieves (最小割模型)

题目地址 :http://acm.timus.ru/problem.aspx?space=1&num=1277 这里我们要拆点。把一个点拆成i,i' 。如何 i,j有边 ,在建边(i,j',inf),(j,i',inf)。 然后每个点点边(i',i,R[i])。这样建边以后,若要阻止 s到f的路径,那么必须破败一些边,那么我们为了是的边权最小,必须破坏边权小于inf的边,对应的就是图中拆

蓝桥杯第八届_方格分割

方格分割 6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。 如图:p1.png, p2.png, p3.png 就是可行的分割法。 试计算: 包括这3种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。 请提交该整数,不要填写任何多余的内容或说明文字。 这里写图片描述 这里写图片描述这里写图片描述 观察可得他是一个中心对