2853 方格游戏(三维棋盘)

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

菜菜看到了一个游戏,叫做方格游戏~

游戏规则是这样的:

在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上角为(1,1),右下角为(n,n)。游戏者需要选择一条(1,1)到(n,n)的路径,并获得路径上奖励的积分。对于路径当然也有要求啦,要求是只能往坐标变大的方向走【从(x,y)到(x+1,y)或者(x,y+1)】,走过2n-1个区域到达(n,n)。当然,获得的积分最高的就能取胜啦。

这时,菜菜看到了他的好友月月,于是邀请她来玩双人版的。双人版的规则就是在单人版的基础上加上一条两人的路线不能相同。月月知道菜菜的很聪明,怕输得太惨,就不太愿意和他玩。菜菜可慌了,于是定义了一个公平值D,这个公平值等于俩人所选择的路径所能获得的积分一一对应相减的差的绝对值之和,即D=sigma (|kxi-kyi|)|(kx,ky分别为菜菜,月月走过的每一个区域的丛林系数)。不过这可是个庞大的计算任务,菜菜找到了你,请你帮忙计算公平值的最大值。

输入描述 Input Description

第一行,一个正整数n

接下来的n行,每行n个整数,表示丛林中每个区域的公平值

输出描述 Output Description

一个整数Dmax,即公平值的最大值

样例输入 Sample Input

4

1 2 3 4

1 5 3 2

8 1 3 4

3 2 1 5

样例输出 Sample Output

13

数据范围及提示 Data Size & Hint

对于20%的数据,保证0<n≤20

对于50%的数据,保证0<n≤50

对于100%的数据,保证0<n≤100且对于所有的i,j保证|Kij|≤300

首先这题四维会爆空间。

所以就学了一下用三维表示。

前提:

1.设两个人的坐标分别为A,B;

2.n*n的方格,从(1,1)点到(n,n)点需要的总步数为2*n+1(n个横,n个列,其中有一个重复)

我们用k来表示步数

我们用i来表示在第k步A的横坐标为i

用j来表示在第k步B的横坐标为j

那么A的坐标可以表示为(i,k-i+1)

B的坐标可以表示为(j,k-j+1)

对于每一个点(i,j)

同样有四中情况转移而来

1.A从上到下    dp[i-1][j][k-1]

2.B从上到下    dp[i][j-1][k-1]

3.AB同时从上到下dp[i-1][j-1][k-1]

4.AB同时从左往右dp[i][j][k-1]

然后再加上这个点的值就好

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cstdlib>
 6 using namespace std;
 7 void read(int &n)
 8 {
 9     char c=‘+‘;int x=0;bool flag=0;
10     while(c<‘0‘||c>‘9‘)
11     {c=getchar();if(c==‘-‘)flag=1;}
12     while(c>=‘0‘&&c<=‘9‘)
13     {x=x*10+(c-48);c=getchar();}
14     flag==1?n=-x:n=x;
15 }
16 int n;
17 int dp[101][101][301];
18 int a[101][101];
19 int ans=0;
20 int main()
21 {
22     read(n);
23     for(int i=1;i<=n;i++)
24         for(int j=1;j<=n;j++)
25             read(a[i][j]);
26     // a :(i,k-i+1)
27     // b :(j,k-j+1)
28     for(int k=1;k<=2*n-1;k++)
29     {
30         for(int i=1;i<=n&&i<=k;i++)
31             for(int j=1;j<=n&&j<=k;j++)
32             {
33                 dp[i][j][k]=max(dp[i-1][j][k-1],dp[i][j][k]);
34                 dp[i][j][k]=max(dp[i][j-1][k-1],dp[i][j][k]);
35                 dp[i][j][k]=max(dp[i-1][j-1][k-1],dp[i][j][k]);
36                 dp[i][j][k]=max(dp[i][j][k-1],dp[i][j][k]);
37                 dp[i][j][k]+=abs(a[i][k-i+1]-a[j][k-j+1]);
38             }
39     }
40     printf("%d",dp[n][n][2*n-1]);
41     return 0;
42 }
时间: 2024-10-10 14:22:28

2853 方格游戏(三维棋盘)的相关文章

codevs——2853 方格游戏(棋盘DP)

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 菜菜看到了一个游戏,叫做方格游戏~ 游戏规则是这样的: 在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上角为(1,1),右下角为(n,n).游戏者需要选择一条(1,1)到(n,n)的路径,并获得路径上奖励的积分.对于路径当然也有要求啦,要求是只能往坐标变大的方向走[从(x,y)到(x+1,y)或者(x,y+1)],走过2n-1个区域到达(n,

codevs 2853 方格游戏--棋盘dp

方格游戏:http://codevs.cn/problem/2853/ 这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表示一个人走到 i 行 j 个点,而另一个人走到 k 行第l个点)这么一个状态. 转移方程当然是$dp[i][j][k][l] = max{ dp[i-1][j][k-1][l] ,dp[i-1][j][k][l-1] ,dp[i][j-1][k-1][l] ,dp[i][j-1][k][l-1 }$

codevs 2853:方格游戏

(排版没搞好,这一行用来卖萌~) 题目描述 Description 菜菜看到了一个游戏,叫做方格游戏~ 游戏规则是这样的: 在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上角为(1,1),右下角为(n,n).游戏者需要选择一条(1,1)到(n,n)的路径,并获得路径上奖励的积分.对于路径当然也有要求啦,要求是只能往坐标变大的方向走[从(x,y)到(x+1,y)或者(x,y+1)],走过2n-1个区域到达(n,n).当然,获得的积分最高的就能取胜啦. 这时,菜菜看到了他

「 CODE[VS] P2853 」 方格游戏

题目大意 给定一张 $n\times n$ 的网格.每个格子上都有一个系数 $a$,先下 $A$ 和 $B$ 两人选择两条 $(1,1)\rightarrow (n,n)$ 路径.要求着两条路径不能相同.并且要计算出两条路径每一个相对应的格子上的系数的差的绝对值之和. 要求选择路径是满足下列条件: 只能选择坐标增加的方向. 解题思路 棋盘 DP. 既然是在一个棋盘中.并且已经规定了行走的方向.所以在移动的格子的数量相同时.两个路径停留的点到 $(1,1)$ 这个点的曼哈顿距离(横坐标$+$纵坐标

三维程序/游戏制作基本常识

flash3d初学者都是从flash或平面绘制转型的,对三维方面的常识的确理解甚少,即使是天天玩三维游戏的人.虽然这些信息对一些三维经验丰富的朋友是简单的不能再简单的东西,但写这一篇对某一些新上手的朋友是有必要的. 建模除非简单几何体,任何复杂一点的模型和贴图位置,都只能靠其他三维软件导入,这不光是flash3d的常识,也是游戏制作的基本常识. 甚至很多朋友会以为既然用flash是可以'画'图形的,那么用flash3d就能直接'画'三维模型.三维模型之所以叫做'建'模,就一定和'画'模有本质的区

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------

黑白棋游戏 (codevs 2743)题解

[问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方格.一个方格最多可有4个相邻方格.在玩黑白棋游戏时,每一步可将任何2个相邻方格中棋子互换位置.对于给定的初始游戏状态和目标游戏状态,编程计算从初始游戏状态变化到目标游戏状态的最短着棋序列. [样例输入] 1111 0000 1110 0010 1010 0101 1010 0101 [样例输出] 4

棋盘覆盖问题

棋盘覆盖问题       问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目

棋盘的多米诺覆盖:Dimer Lattice Model,Pfaff 多项式,Kasteleyn 定理

这次来介绍计数组合学里面一个经典的问题:Dimer Lattice Model.问题是这样的:一个有 64 个方格的国际象棋棋盘,有多少种不同的多米诺骨牌覆盖?这里的覆盖是指不重复不遗漏地盖住整个棋盘. 下图是一种可能的覆盖方式(图片来自 Wiki 百科): 这个问题的答案是 12988816,非常大的一个数字,绝对不是一个一个数出来的.1961 年德国物理学家 Kasteleyn 借助于线性代数中的一个结论首先解决了这个问题,我们接下来就介绍他的方法. ~~~~~~~~~~~~~~~~~~~~