2014百度之星第四题Labyrinth(DP)
Labyrinth
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1804 Accepted Submission(s): 626
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
题解:
拿到本题。第一想法是DFS,n=100,肯定超时。
后来抓到了关键条件不能往左走,于是非常自然的有了动态规划想法。总的想法是一列一列的处理,当前列依据上一列求得,每一个位置依次上下比較全部可能,总的时间复杂度O(m*n*n)。
自上而下的dp[i][j]=max(dp[i][j],dp[k][j-1]+∑wei[k][j])。k<i。
自下而上的dp[i][j]=max(dp[i][j],dp[k][j-1]+∑wei[k][j]),i<k<n;
贴段代码:
#include <iostream>
#include <cstdio>
using namespace std; const int MAXN = 100+10;
const int INF =100*100*150; int n, m;
int g[MAXN][MAXN];
int dp[MAXN][MAXN]; void Sovle(int x)
{
int i,j,tmp;
for(i = 1; i <= m; ++i)
{
tmp =dp[i][x-1] + g[i][x];
if(dp[i][x] < tmp)
dp[i][x] = tmp;
for(j = i+1; j <= m; ++j)
{
tmp +=g[j][x];
if(tmp > dp[j][x])
dp[j][x] = tmp;
}
}
for(i = m; i > 0; --i)
{
tmp =dp[i][x-1] +g[i][x];
if(dp[i][x] < tmp)dp[i][x] = tmp;
for(j = i-1; j > 0; --j)
{
tmp += g[j][x];
if(tmp >dp[j][x])
dp[j][x] = tmp;
}
}
} int main()
{
int i,j,cas,tag=1;
scanf("%d", &cas);
while(cas--)
{
scanf("%d%d", &m, &n);
for(i = 1; i <= m; ++i)
{
for(j = 1; j <= n; ++j)
{
scanf("%d", &g[i][j]);
dp[i][j] = -INF;
}
}
dp[1][1] = g[1][1];
for(i = 2; i <= m; ++i)
{
dp[i][1] = dp[i-1][1] + g[i][1];
}
for(i = 2; i <= n; ++i)
{
Sovle(i);
}
printf("Case #%d:\n%d\n",tag++, dp[1][n]);
}
return 0;
}
2014百度之星第四题Labyrinth(DP)的更多相关文章
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014百度之星预赛(第二场)——Best Financing
2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- 2014百度之星初赛第二场hdu 4831 Scenic Popularity
Scenic Popularity Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014年百度之星资格赛第四题Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫.该迷宫仅仅能从矩阵左上角第一个方格開始走.仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014百度之星第一题Energy Conversion
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- [置顶] Direct UI
有个坑爹的说法:其实Direct UI只是一个思想,要实现这个思想,还要靠自己. 采用windowless方式用api或gdi实现ui的绘制. DirectUI意为直接在父窗口上绘图(Paint on ...
- linux修改系统时间date命令加clock -w
http://m.jb51.net/LINUXjishu/117784.html 修改linux系统时间的方法(date命令) 11-18 23:22:27作者:脚本之家 命令格式为: date -s ...
- 剑指offer57 删除链表中重复的结点
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(!pHead) return pHead; str ...
- Xcoder 7.0 免证书真机测试
相信大家已经看了WWDC大会上的内容了,在iOS9和Xcoder7.0以后真机测试不需要在购买付费账号了,(当然你要想上传appstore还是需要付费账号的). 今天我带大家来看下免证书的真机测试如何 ...
- Android工程师面试准备知识点
听+7哥说,把下面的全弄懂,面试必过,所以我就试着去把所有题目补充了一下,各位能耐的网友们,如果有吐槽或者补充的尽管给我留言,在这里谢过大家了. 1. android的多线程如何通信 答:Andr ...
- hdu 5607 graph (矩阵乘法快速幂)
考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...
- 如何使用TestFlight进行App构建版本测试(转)
在日常的开发当中,当一个项目在开发过程中或者完成准备上线,都需要我们进行真机测试,否则不可能开发完了就直接扔到了App,等上线了再下载看看,这都是不可能的.那么说到真机测试,大家肯定会想到弄一个99美 ...
- 【贪心】【TOJ4107】【A simple problem】
Given three integers n(1≤n≤1018), m(1≤m≤105), k(1≤k≤1018). you should find a list of integer A1,A2,- ...
- Oracle存储过程 使用游标、数组的配合查询
查询输入的门牌号码是否在标准门牌库中存在.存在则返回相应的号码. public string GetValidate(){ OracleConnection conn = ConnectOra(); ...
- php预定义常量&变量
PHP中可以使用预定义常量获取PHP中的信息,常用的预定义常量如下表所示. 常量名 功能 _FILE_ 默认常量,PHP程序文件名 _LINE_ 默认常量,PHP程序行数 PHP_VERSION ...