题目4:棋盘寻宝扩展
题目4:棋盘寻宝扩展
http://ac.jobdu.com/problem.php?cid=1048&pid=3
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:59
解决:32
- 题目描述:
-
现在有一个8*8的棋盘,上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于100),一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角。从棋盘的左上角移动到右下角的时候的,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,但是拿到的所有的礼物的价值之和不大于一个限定值limit,请设计一个算法请实现,使其能够获得不超过限制值limit的最大价值的礼物。
- 输入:
-
输入包含多个测试用例,每个测试用例共有9行,第一行是一个限制值limit<=1000,下面还有8行8列,第i行的第j列的数字代表了该处棋盘上的礼物的价值,每两个数之间用空格隔开。
- 输出:
-
对于每组测试用例,请输出你能够获得不超过限制值limit的最大价值的礼物。若没有符合条件的线路则输出-1。
- 样例输入:
-
90 4 2 5 1 3 8 9 7 4 5 2 3 7 1 8 6 7 2 1 8 5 9 3 6 2 8 9 5 6 3 1 7 1 2 4 5 3 7 9 6 3 5 7 8 9 6 2 4 10 8 1 4 7 5 3 9 7 4 6 2 1 3 9 8
- 样例输出:
-
90
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int limit,map[10][10]; int dp[10][10][1010]; int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d",&limit)){ for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) scanf("%d",&map[i][j]); memset(dp,0,sizeof(dp)); for(int i=8;i>=1;i--) for(int j=8;j>=1;j--) for(int k=0;k<=limit;k++){ if(k>=map[i][j]){ int tmp=0; if(i!=8 && dp[i+1][j][k-map[i][j]]>tmp) tmp=dp[i+1][j][k-map[i][j]]; if(j!=8 && dp[i][j+1][k-map[i][j]]>tmp) tmp=dp[i][j+1][k-map[i][j]]; if(tmp==0 && !(i==8 && j==8)) dp[i][j][k]=0; else dp[i][j][k]=tmp+map[i][j]; } } if(dp[1][1][limit]!=0) printf("%d\n",dp[1][1][limit]); else puts("-1"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架