hdu4826Labyrinth-dp 动态规划

news/2024/11/28 3:45:16/

Labyrinth

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1839    Accepted Submission(s): 814


 

Problem Description

度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币?

 

 

Input

输入的第一行是一个整数T(T < 200),表示共有T组数据。
每组数据的第一行输入两个正整数m,n(m<=100,n<=100)。接下来的m行,每行n个整数,分别代表相应格子中能得到金币的数量,每个整数都大于等于-100且小于等于100。

 

 

Output

对于每组数据,首先需要输出单独一行”Case #?:”,其中问号处应填入当前的数据组数,组数从1开始计算。
每组测试数据输出一行,输出一个整数,代表根据最优的打法,你走到右上角时可以获得的最大金币数目。

 

 

Sample Input

 

2 3 4 1 -1 1 0 2 -2 4 2 3 5 1 -90 2 2 1 1 1 1

 

 

Sample Output

 

Case #1: 18 Case #2: 4

 

 

Source

2014年百度之星程序设计大赛 - 资格赛

 

 

Recommend

liuyiding

 分析:

dfs搜索会超时,一开始想的是搜索会超时,所以考虑dp,一开始想的是dp[i][j]=max  {dp[i-1][j]  ,dp[i][j-1],  dp[i+1][j] }+map[i][j],加点边界预判条件,但是这样是错误的,因为假设当走到第i,j位置时候,dp[i+1][j]还没走过,所以这一个状态就无法实现。所以要从上边和下边同时开始走(都是从最右端出发的),他们都可以从右边得到。

 

 

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {static int n,m;static final long mod=1000000007;public static void main(String args[])throws IOException  {Scanner in = new Scanner(System.in);int t=in.nextInt();int kase=0;while(t-->0){kase++;int n=in.nextInt();int m=in.nextInt();int[][]map =new int[105][105];int[][]dp1=new int[105][105];int[][]dp2=new int[105][105];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){map[i][j]=in.nextInt();}for(int i=1;i<=m;i++)//预处理边界问题,把他们无限小dp1[0][i]=dp2[n+1][i]=-(1<<30);dp1[0][1]=0;for(int i=1;i<=n;i++){dp1[i][1]=dp1[i-1][1]+map[i][1];dp2[i][1]=-(1<<30);}for(int j=2;j<=m;j++){for(int i=1;i<=n;i++){dp1[i][j]=Math.max(dp1[i][j-1],Math.max(dp1[i-1][j],dp2[i][j-1]))+map[i][j];}for(int i=n;i>=1;i--){dp2[i][j]=Math.max(dp2[i][j-1],Math.max(dp2[i+1][j],dp1[i][j-1]))+map[i][j];}}System.out.println("Case #"+kase+":");System.out.println(Math.max(dp1[1][m], dp2[1][m]));//走到右上角第一个格子}}}

 


http://www.ppmy.cn/news/126034.html

相关文章

导弹拦截(最长非上升子序列和最长上升子序列)

题目描述 题目链接某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于…

【Uva 10723】Cyborg Genes

【Link】: 【Description】 给你两个串s1,s2; 让你生成一个串S; 使得s1和s2都是S的子列; 要求S最短; 求S的不同方案个数; 【Solution】 设两个串的长度分别为n1和n2; 则答案为n1n2-两个串的最长公共子序列 不同的串则可以在求最长公共子序列的时候顺便求出; 设dp2[…

dos批处理中%~dp0%的说明

%~dp0 “d”为Drive的缩写&#xff0c;即为驱动器&#xff0c;磁盘、“p”为Path缩写&#xff0c;即为路径&#xff0c;目录cd是转到这个目录&#xff0c;使用 /D 开关&#xff0c;除了改变驱动器的当前目录之外&#xff0c;还可改变当前驱动器。 选项语法:~0 - 删除任何引号(&…

【硬件】【USB】【Type-C】

Type-C 接口优点&#xff1a; 接口信号对称分布&#xff0c;支持正反插兼容 USB3.1、USB3.0、USB2.0、USB1.1最高传输速率支持到 10Gbps最大功率支持 100W&#xff08;20V&5A&#xff09;支持 DisplayPort video 和 4路 audio channel 接口定义 公头&#xff1a; 母头&a…

动态规划——导弹拦截(最长不上升子序列、最长上升子序列)

题目链接 题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。…

算法---LeetCode 198. 打家劫舍

1. 题目 原题链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上 被小偷闯入&#xff0c;系统会自动报警。 给定一个代表…

[kuangbin带你飞]专题十二 基础DP1 -B - Ignatius and the Princess IV

“OK, you are not too bad, em… But you can never pass the next test.” feng5166 says. “I will tell you an odd number N, and then N integers. There will be a special integer among them, you have to tell me which integer is the special one after I tell y…

Android P DP1:WiFi-RTT、刘海、多摄像头、GIF动画、NNAPI 1.1

\ 看新闻很累&#xff1f;看技术新闻更累&#xff1f;试试下载InfoQ手机客户端&#xff0c;每天上下班路上听新闻&#xff0c;有趣还有料&#xff01;\ \\ 谷歌发布了Android P第一个开发预览版&#xff08;DP1&#xff09;&#xff0c;其中有几项值得注意的新特性&#xff1a;…