2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1507 Accepted Submission(s): 520
每组数据的第一行输入两个正整数m,n(m<=100,n<=100)。接下来的m行,每行n个整数,分别代表相应格子中能得到金币的数量,每个整数都大于等于-100且小于等于100。
每组测试数据输出一行,输出一个整数,代表根据最优的打法,你走到右上角时可以获得的最大金币数目。
#include <iostream>
#include <stdio.h>
using namespace std;
#define inf 0x7fffffff
int a[][];
int dp[][]; //记录走到某一位置的金币最大值
int m,n;
void DP()
{
int i,j,k;
dp[][] = a[][];
for(i=;i<=m;i++) //初始化第一列
dp[i][] = dp[i-][] + a[i][];
for(i=;i<=n;i++){ //每一列 a[][i]
for(j=;j<=m;j++){ //每一列的每一个位置 a[j][i]
//有三种路径到达这个位置。
//1.它左边的位置直接向右走过来。
//2.它左边的位置的上面所有位置向右再一直向下走到这个位置。
//3.它左边的位置的下面所有位置向右再一直向上走到这个位置。
//不断比较,在这个位置处 dp[j][i] 记录以上3条路径的最大值。即为走到这个位置的能拥有的最大金币数。
//这是以 a[j][i] 为重心考虑,遍历到达 a[j][i]的三种路径,求出最大值
int t = dp[j][i-] + a[j][i];
if(t>dp[j][i])
dp[j][i] = t;
for(k=j-;k>=;k--){
//a[k][i-1] --> a[j][i]这个位置所拥有的金币数
t = t-dp[k+][i-]+dp[k][i-]+a[k][i];
if(t>dp[j][i])
dp[j][i] = t;
}
t = dp[j][i-] + a[j][i];
for(k=j+;k<=m;k++){
//a[k][i-1] --> a[j][i]这个位置所拥有的金币数
t = t-dp[k-][i-]+dp[k][i-]+a[k][i];
if(t>dp[j][i])
dp[j][i] = t;
}
}
}
}
int main()
{
int i,j,Case,T;
scanf("%d",&T);
for(Case=;Case<=T;Case++){
scanf("%d%d",&m,&n);
for(i=;i<=m;i++) //输入迷宫,初始化dp[][]
for(j=;j<=n;j++){
scanf("%d",&a[i][j]);
dp[i][j] = -inf;
}
printf("Case #%d:\n",Case);
DP();
printf("%d\n",dp[][n]);
}
return ;
}
贴上超时的DFS代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int Max;
int a[][];
bool isv[][];
int dx[] = {,-,};
int dy[] = {,,};
int m,n;
bool judge(int x,int y)
{
if(x< || x>m || y< || y>n)
return true;
if(isv[x][y])
return true;
return false;
}
void dfs(int x,int y,int money)
{
if(x== && y==n){
if(money>Max)
Max=money;
}
int i;
for(i=;i<;i++){
int nx = x+dx[i];
int ny = y+dy[i];
if(judge(nx,ny))
continue;
//可以走
isv[nx][ny] = true;
dfs(nx,ny,money+a[nx][ny]);
isv[nx][ny] = false;
}
}
int main()
{
int i,j,Case,T;
scanf("%d",&T);
for(Case=;Case<=T;Case++){
scanf("%d%d",&m,&n);
for(i=;i<=m;i++)
for(j=;j<=n;j++)
scanf("%d",&a[i][j]);
printf("Case #%d:\n",Case);
Max=;
memset(isv,,sizeof(isv));
isv[][] = true;
dfs(,,a[][]);
printf("%d\n",Max);
}
return ;
}
2014百度之星资格赛 1004:Labyrinth(DP)的更多相关文章
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- 百度之星资格赛 1004 度度熊的午饭时光(01背包+最小序号和+字典序+有bug)
分析 首先声明一下,我的代码有漏洞的,求大神给个正确代码 思路如下: 首先做一遍01背包记录路径并求出最大总分,令path[i][j]表示第i个物品包含在dp[j]的求值过程中.再逆序枚举money, ...
- 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- ACM学习历程—BestCoder 2015百度之星资格赛1004 放盘子(策略 && 计算几何)
Problem Description 小度熊喜欢恶作剧.今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子的是获胜者,会赢得失败者的一个吻.玩了两次以后,小度熊发 ...
- 2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- ACM-百度之星资格赛之Labyrinth——hdu4826
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- nginx 免安装包
在一个环境下编译安装好nginx,然后可以拷贝到其他环境使用.同时避免直接安装造成的环境冲突. 首先下载好nginx和相关插件.然后编译安装到沙盒里面.demo如下: cd到nginx目录 ./con ...
- 2016 Multi-university training contest
day 1 A 给G,w(e)1M(diff),|V|100K,|E|1M,求 MST MST上任意两点间距离的期望 显然MST唯一 E(dis(u,v))可以通过计算每条边的贡献加出来 B n个并行 ...
- MySQL客户端Workbench
MySQL客户端除了Navicat之外,还有官方推出的MySQL Workbench,能看到数据库包含的存储过程,而Navicate不能. 下载链接: 32位:http://cdn.mysql.com ...
- Python 列表元素排重uniq
# -*- coding: gbk -*- def uniq(ls): lsCopy=[e for e in ls] for i in xrange(1,len(ls)): for j in xran ...
- 如何区分SNAT和DNAT
从定义来讲它们一个是源地址转换,一个是目标地址转换.都是地址转换的功能,将私有地址转换为公网地址.要区分这两个功能可以简单的由连接发起者是谁来区分: 内部地址要访问公网上的服务时(如web ...
- sharepoint2010匿名访问
怎样在SharePoint 2010网站中启用匿名访问 SharePoint 2010的改动比较大,尤其是相对SharePoint Portal Server 2003来说.本文介绍在SharePoi ...
- poj 2524 (并查集)
http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...
- POJ 2559
http://poj.org/problem?id=2559 题意:就是找出可以完整连接的最大的矩形面积. 思路:找出单独的一块矩形,往两边延伸,记录两边的比他高的矩形是在哪个位置,然后最右的位置减去 ...
- centos7精简版(minimal)killall: command not found
centos7精简版(minimal)运行killall命令提示 command not found 是由于没有安装psmisc所致 Psmisc软件包包含三个帮助管理/proc目录的程序. 安装下列 ...
- PHP带重试功能的curl
2016年1月13日 10:48:10 星期三 /** * @param string $url 访问链接 * @param string $target 需要重试的标准: 返回结果中是否包含$tar ...