时间限制: 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

分类标签 Tags 点此展开

动态规划 棋盘型DP

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,a[200][200],dp[200][200][400];
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}} for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=2*n;k++)dp[i][j][k]=-2147483640;dp[1][1][2]=0; for(int k=3;k<=2*n;k++){for(int j=1;j<=n;j++){for(int i=1;i<=n;i++){if(k-i>n || k-j>n) continue;if(k-i<1 || k-j<1) break; else dp[i][j][k]=max(max(dp[i-1][j][k-1],dp[i][j][k-1]),max(dp[i][j-1][k-1],dp[i-1][j-1][k-1]))+abs(a[i][k-i]-a[j][k-j]);}}}cout<<dp[n][n][2*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  也就是说要倒着循环

转载于:https://www.cnblogs.com/z360/p/6746300.html

codevs——2853 方格游戏(棋盘DP)相关推荐

  1. 11th 【棋盘dp 动态规划】捡钱

    捡钱 背景描述: 最近,Henry由于失恋(被某大牛甩掉!)心情很是郁闷.所以,他去了大牛家,寻求Michael大牛的帮助,让他尽快从失恋的痛苦中解脱出来.Michael大牛知道Henry是很爱钱的, ...

  2. CodeVs 1148 传球游戏

    CodeVs 1148 传球游戏 解题报告                                                      by MPS ------------------ ...

  3. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

  4. [codevs 1227] 方格取数2

    [codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...

  5. codevs 1269 匈牙利游戏

    codevs 1269 匈牙利游戏 题目大意:求次短路 数据范围:2≤n≤20000,1≤m≤100000,1≤L≤10000 思路:spfa的时候在更新最短路的时候顺便更新一下次短路就好了. 题解: ...

  6. 使用双重循环实现五子棋游戏棋盘的绘制

    使用双重循环实现五子棋游戏棋盘的绘制 使用双重循环实现五子棋游戏棋盘的绘制,棋盘界面的具体效果如下: public class Demo103 {public static void main(Str ...

  7. 数字游戏——数位dp问题

    数字游戏 数位dp思路: 首先考虑第一个数字能填什么,预处理第一个数字能填的数(除去边界),然后去判断边界,即让循环往下走. 代码 #include <iostream> #include ...

  8. 【鸿蒙万能卡片-Codelabs挑战赛】舒尔特方格游戏万能卡片

    前言 舒尔特方格游戏,是注意力训练方法之一,可以帮助孩子纠正上课分心走神.回家做作业拖拉毛病,但不能贪玩哦,玩多了,对眼睛,视力不好. 消息通知栏,通知用户当前最优成绩,也就是当前最快时间. 元服务卡 ...

  9. [luogu2059 JLOI2013] 卡牌游戏 (概率dp)

    [luogu2059 JLOI2013] 卡牌游戏 (概率dp) 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等 ...

最新文章

  1. 每天一个linux命令(10):cat 命令
  2. 为什么程序员不擅长评估开发时间?(转)
  3. ftime()函数的用法----算函数运行时间
  4. 哪些人员可以申请外国人永久居留证?
  5. java io字符输出流_JAVA IO 字符输入流与输出流总结说明
  6. 前端路由的两种实现原理
  7. 为什么这么多人在用Redis
  8. 动态规划实战15 leetcode-256. Paint House
  9. TIdTCPClient的几种方法
  10. 计算机改考408的学校,2020考研 河北工业大学计算机改考408
  11. Java+Axis WebService接口开发实例
  12. 无人驾驶学习---第一课
  13. Ubuntu完全卸载与安装Mysql
  14. 小哥哥,小姐姐,我有一份tcp、http面试指南你要吗?
  15. 拓嘉辰丰电商:拼多多店铺SUK如何设置
  16. DHT11温湿度传感器学习笔记
  17. 爱普生LQ-610K针式打印机不通电维修
  18. 汤晓丹的第四版计算机操作系统--第九章总结概述
  19. 基于esp32 Arduino自制蓝牙HUD显示
  20. 南通六年级英语口语听力测试软件,吐血整理一波英语口语练习软件给你,还有哪些要注意...

热门文章

  1. 使用MAT做jvm的GC Roots溯源
  2. 集成学习(ensemble learning)(四)
  3. 程序员开发利器:源代码管理的十条建议
  4. dart正则替换手机号中间四位为*
  5. 公文转成电子文档需要注意的事项
  6. 神策数据加入中国大数据产业生态联盟,神策营销云及融媒解决方案获联盟认证
  7. 微信内测附近的餐厅,小程序要跨界外卖了?
  8. Object.wait()与Object.notify()的用法
  9. jQuery的弹出窗口插件colorbox
  10. Android 程序 正确修改包名的方式(源代码)