寻宝游戏

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 165    Accepted Submission(s): 34

Problem Description
小Q最近迷上了一款寻宝游戏,这款游戏中每局都会生成一个 n×m的网格地图,从上往下依次编号为第 1行到第 n行,从左往右依次编号为第 1列到第 m列。每个格子上都有不同数量的金币,第 i行第 j列的格子上的金币数量为 ai,j。

小Q一开始位于 (1,1),每次他可以往右或者往下走,每当他经过某个格子时,他就可以拿走这个格子上的所有金币。小Q不能走出这个地图,当小Q不能再行动时,游戏结束。显然当且仅当小Q位于 (n,m)时,游戏才会结束。

一轮游戏的得分为这一轮中收集到的金币总量,而在游戏开始前,因为小Q是超级VIP用户,所以他有 k次机会交换某两个格子中的金币数。这 k次机会不一定要用完,请写一个程序帮助小Q在一轮内拿到尽可能多的金币。

Input
第一行包含一个正整数 T(1≤T≤10),表示测试数据的组数。

每组数据第一行包含三个整数 n,m,k(2≤n,m≤50,0≤k≤20),分别表示地图的长宽以及交换的次数。

接下来 n行,每行 m个整数 ai,j(0≤ai,j≤106),依次表示每个格子中金币的数量。

Output
对于每组数据,输出一行一个整数,即能收集到的金币数量的最大可能值。
Sample Input
2 3 4 0 1 2 3 4 9 8 7 6 5 4 7 2 5 5 1 9 9 9 0 0 0 0 9 0 0 0 0 0 0 0 0 0 9 0 0 9 0 9 9 9
Sample Output
34 81
Source
"字节跳动杯"2018中国大学生程序设计竞赛-女生专场

上为qls题解截图。

下边是我做题中的愚见:

题目一看就是DP,有一种从1,1到n,m的n^2的DP,然而这个多了k次交换,所以题目从2维DP变成了4维DP。

dp[i][j][p][q]:表示走到(i,j)位置必经之路上没拿了p个非必经之路上拿了q个。

状态转移方程:

dp[i][j][p][q] = max ( dp[i][j][p][q] , dp[i-1][j][p][q]+mp[i][j] );//从上边直接下来

dp[i][j][p][q] = max ( dp[i][j][p][q] , dp[i-1][j][p-1][q] );

dp[i][j][p][q] = max ( dp[i][j][p][q] , dp[i][j][p][q-r]+que[r] );

dp[i][j][p][q] = max ( dp[i][j][p][q] , dp[i][j-1][p][q]+mp[i][j] );

dp[i][j][p][q] = max ( dp[i][j][p][q] , dp[i][j-1][p-1][q] );

#include <bits/stdc++.h>
using namespace std;
int Map[55][55];
int dp[55][55][55][55];
int a[55];
int Index;
int cmp(int a,int b)
{return a>b;
}
int main()
{int t;scanf("%d",&t);while(t--){int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&Map[i][j]);memset(dp,-1,sizeof(dp));dp[1][1][0][0]=Map[1][1];//取了第一个 dp[1][1][1][0]=0;      //没取 for(int i=1;i<=n;i++)//n*n*k*k*k{for(int j=1;j<=m;j++){a[0]=0;Index=0;     for(int k=1;k<=m;k++)//是从当前点往前和上一行当前点往后 {if(k<j)a[++Index]=Map[i][k];else if(k>j)a[++Index]=Map[i-1][k];}sort(a+1,a+Index+1,cmp); //从大到小排序 将那些不是必经之路上的点取出来for(int k=1;k<=Index;k++)//求个前缀和a[k]=a[k]+a[k-1];for(int p=0;p<=k;p++){for(int q=0;q<=k;q++){if(dp[i-1][j][p][q]!=-1) //从上边过来(经过的路上) dp[i][j][p][q]=max(dp[i][j][p][q],dp[i-1][j][p][q]+Map[i][j]); if(p>=1 && dp[i-1][j][p-1][q]!=-1)//考虑有个点取还是没取 比如前边的那个第一个点 dp[i][j][p][q]=max(dp[i][j][p][q],dp[i-1][j][p-1][q]); } }   for(int p=k;p>=1;p--){for(int q=k;q>=0;q--){for(int r=p;r>=1;r--)//有多少非必经之路的 {if(dp[i][j][q][p-r]!=-1 && p-r>=0)//取出来r个 dp[i][j][q][p]=max(dp[i][j][q][p],dp[i][j][q][p-r]+a[r]); }}}for(int p=0;p<=k;p++){for(int q=0;q<=k;q++){if(dp[i][j-1][p][q]!=-1)dp[i][j][p][q]=max(dp[i][j][p][q],dp[i][j-1][p][q]+Map[i][j]); if(p>=1 && dp[i][j-1][p-1][q]!=-1)dp[i][j][p][q]=max(dp[i][j][p][q],dp[i][j-1][p-1][q]);}} }       }int ans=0;for(int i=0;i<=k;i++)ans=max(ans,dp[n][m][i][i]);printf("%d\n",ans);}return 0;
}

hdu 6289 寻宝游戏相关推荐

  1. SDOI2015寻宝游戏 dfs序+set

    SDOI2015寻宝游戏 好像是一道虚树入门题? 虚树???不会不会我弱死了.. Solution: 关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径. 基于这个思 ...

  2. 河北工业大学c语言寻宝游戏,计算机技术基础(c语言)课程设计寻宝游戏.doc

    计算机技术基础(c语言)课程设计寻宝游戏 计算机技术基础(c语言)课程设计 寻宝游戏 #include #include #include #include #include #define ESC ...

  3. 寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 - 物联网小游戏

    寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 作者简介 科科香,程序员 方向:IoT,方案集成,喜好各种新鲜东东 转载请注明出处 iBeacon简介 iBeacon(下面简称Beaco ...

  4. minecraft_使用MCDungeon将地牢,废墟和寻宝游戏添加到您的Minecraft世界中

    minecraft If you've grown tired of exploring the vanilla Minecraft world and the thrill of stumbling ...

  5. 许嵩续约太合音乐集团 携手开启《寻宝游戏》

    7月24日,许嵩<寻宝游戏>发布会暨续约仪式在北京顺利召开.在推出新专辑<寻宝游戏>之际,也宣布续约太合音乐集团,启动未来"无限"可能. 许嵩畅谈新专< ...

  6. 【BZOJ 3991】 [SDOI2015]寻宝游戏

    3991: [SDOI2015]寻宝游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 251 Solved: 137 [Submit][Status ...

  7. 【SDOI2015】【BZOJ3991】寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...

  8. 06:寻宝_第1集:寻宝游戏!

    06:寻宝 Let's kick things off with something a bit unusual: a virtual scavenger hunt. 让我们从一些不寻常的事情开始:虚 ...

  9. C++实现设计一个迷宫寻宝游戏

    1)设计一个迷宫地图,包含墙壁.通道.宝藏和敌人.可以使用不同的字符表示地图的各个元素. 2)程序随机生成迷宫地图,并在地图上随机放置宝藏和敌人. 3)玩家通过控制字符移动,尝试找到宝藏.玩家可以使用 ...

最新文章

  1. [转载]IPMSG(飞鸽传书)协议翻译
  2. 模板 - 欧拉路、欧拉回路(一笔画问题)
  3. 计算距离torch.nn.PairwiseDistance
  4. 2021年高考成绩查询贵州分数线,2021年贵州省高考分数线
  5. 事务以及@Transcational注解
  6. TCP/IP面试常考题目
  7. ffmpeg中的时间单位
  8. 基于Web的爬虫系统设计与实现
  9. arduino SIM868发送post请求到服务器,解决只能成功发送一次的问题
  10. 如何用Android平板上课写代码(摸鱼)
  11. android商品详情详解
  12. MATLAB对光路进行模拟,MATLAB辅助OptiSystem实现光学反馈环路的模拟
  13. 个人第1次作业:阅读与准备作业
  14. IDEA 修改单行的注释格式
  15. sdlc esd oracle,SDLC-PCIE高速同步串口卡
  16. matlab怎样编程形成软件_Matlab编程笔记之GUI程序转exe
  17. JS 中国标准时间转换yy-mm-dd HH:mm:ss
  18. [java] POI shiftRows 移动后合并的单元格被拆分了
  19. 从ZigBee到Matter,智能家居碎片化时代或将终结
  20. 使用 Web3.js 连接以太坊节点并查询区块链数据

热门文章

  1. 安鸾渗透telnet暴力破解
  2. 【Graph Embedding】LINE:算法原理,实现和应用
  3. 百度地图api之创建自定义控件
  4. 关于Tomcat启动失败的解决方案
  5. 学习表——受任于败军之际,奉命于危难之间(11.28-12.4)
  6. ZYNQ 之PS 和PL 互联技术之AXI
  7. 如何安装Tomcat
  8. CVE-2018-8961复现
  9. 网络原理实验4 路由协议的配置
  10. dd-wrt 去广告_如何在DD-WRT上使用Pixelserv删除广告