codevs——2853 方格游戏(棋盘DP)
菜菜看到了一个游戏,叫做方格游戏~
游戏规则是这样的:
在一个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分别为菜菜,月月走过的每一个区域的丛林系数)。不过这可是个庞大的计算任务,菜菜找到了你,请你帮忙计算公平值的最大值。
第一行,一个正整数n
接下来的n行,每行n个整数,表示丛林中每个区域的公平值
一个整数Dmax,即公平值的最大值
4
1 2 3 4
1 5 3 2
8 1 3 4
3 2 1 5
13
对于20%的数据,保证0<n≤20
对于50%的数据,保证0<n≤50
对于100%的数据,保证0<n≤100且对于所有的i,j保证|Kij|≤300
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; ][],dp[][][]; int main(){ cin>>n; ;i<=n;i++){ ;j<=n;j++){ cin>>a[i][j]; } } ;i<=n;i++) ;j<=n;j++) ;k<=*n;k++) dp[i][j][k]=-; dp[][][]=; ;k<=*n;k++){ ;j<=n;j++){ ;i<=n;i++){ if(k-i>n || k-j>n) continue; || k-j<) break; ][j][k-],dp[i][j][k-]),max(dp[i][j-][k-],dp[i-][j-][k-]))+abs(a[i][k-i]-a[j][k-j]); } } } cout<<dp[n][n][*n]; }
思路:
状态压缩,四维会爆!改成三维!
本题是一道典型的动态规划题。
我们首先来设计状态,用f[i][j][k]表示第i步时,菜菜的路径在横坐标为j的区域,月月的路径在横坐标为k的格子上时,当前公平值的最大值。这样三个值用来表示状态已经足够,因为菜菜和月月的位置可以用(j,i-j+1)和(k,i-k+1)来表示。
状态转移方程根据两人移动的方法设置如下:
f[i][j][k] = max{f[i-1][j-x][k-y]} + |a[j][i-j+1] - a[k][i-k+1]|, x,y = 0,1}
这样,本题就解决了,本题的时间复杂度为O(n3)。
千万要注意在循环的时候是先循环k再循环j最后i 也就是说要倒着循环
codevs——2853 方格游戏(棋盘DP)的更多相关文章
- codevs 2853 方格游戏--棋盘dp
方格游戏:http://codevs.cn/problem/2853/ 这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表 ...
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- codevs 2853:方格游戏
(排版没搞好,这一行用来卖萌~) 题目描述 Description 菜菜看到了一个游戏,叫做方格游戏~ 游戏规则是这样的: 在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上 ...
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
- 求次短路 codevs 1269 匈牙利游戏
codevs 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descriptio ...
- 「 CODE[VS] P2853 」 方格游戏
题目大意 给定一张 $n\times n$ 的网格.每个格子上都有一个系数 $a$,先下 $A$ 和 $B$ 两人选择两条 $(1,1)\rightarrow (n,n)$ 路径.要求着两条路径不能相 ...
- P2016 战略游戏——树形DP大水题
P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...
- [JLOI2013]卡牌游戏 概率DP
[JLOI2013]卡牌游戏 概率DP 题面 \(dfs\)复杂度爆炸,考虑DP.发现决策时,我们只用关心当前玩家是从庄家数第几个玩家与当前抽到的牌是啥.于是设计状态\(f[i][j]\)表示有\(i ...
- P1006 传纸条[棋盘DP]
题目来源:洛谷 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接 ...
随机推荐
- 【File】文件操作(初识文件操作一)
一,初识文件流 看到标题就知道接下来的所有操作对象都是面对文件进行的.那么问题来了.在java中目录是不是也属于文件呢?答案是yes.既然目录也属于文件,那么对于目录跟文件的区分就显现出来了.在接下来 ...
- (JAVA指针),对象引用问题
引出指针 从表面上看JAVA是没有指针的,或者是说,弱化了指针.但是指针在JAVA中还是真真切切存在的.在Java中我们称之为引用. String a;//引用为空 String a = new S ...
- Java语言基础---逻辑运算(长路短路运算)
长路短路运算的区别 长路与运算&:是指在两边都是整数时,是逐位与运算,在两边是关系运算时,是逻辑运算. 短路与运算&&:是指从左至右,遇到false,则停止后面的运算. 长路或 ...
- cf982d Shark
ref #include <algorithm> #include <iostream> #include <cstdio> #include <map> ...
- 转投emacs
(global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-z&q ...
- laravel5.2总结--邮件
laravel自带SwiftMailer库,集成了多种邮件API,支持多种邮件驱动方式,包括smtp.Mailgun.Maildrill.Amazon SES.mail和sendmail,Mailgu ...
- 39、apk瘦身(转载)
本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用 ...
- 【Palindrome Number】cpp
题目: Determine whether an integer is a palindrome. Do this without extra space. click to show spoiler ...
- 【Python Selenium】简单数据生成脚本
最近因工作需要,写了一个简单的自动化脚本,纯属学习,顺便学习下selenium模块. 废话不多说,直接上代码!! 这里一位大神重写了元素定位.send_keys等方法,咱们直接进行调用. 适用Pyth ...
- Selenium 中 高亮元素
//高亮元素 WebElement element = driver.findElement(By.cssSelector(".table1 .btn-public label" ...