hdu 4826 三维dp

dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据  这个的填充是个坑。。#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF -10000000
int mapp[105][105];
int dp[2][105][105];

int main()
{
    int t,cnt=0;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                scanf("%d",&mapp[i][j]);
        for(int i=0;i<2;i++)
            for(int j=0;j<105;j++)
                for(int k=0;k<105;k++)
                    dp[i][j][k]=INF;
        dp[0][0][1]=0;
        for(int i=1;i<=n;i++)// 游戏规则
            dp[0][i][1]=dp[1][i][1]=dp[0][i-1][1]+mapp[i][1];
        for(int j=2;j<=m;j++)//这里强调遍历列而不是行
            for(int i=1;i<=n;i++)
            {
                dp[0][i][j]=dp[1][i][j]=max(dp[0][i][j-1],dp[1][i][j-1])+mapp[i][j];
                for(int k=i;k<=n;k++)
                    dp[0][k][j]=max(dp[0][k][j],dp[0][k-1][j]+mapp[k][j]);
                for(int k=i;k>=1;k--)
                    dp[1][k][j]=max(dp[1][k][j],dp[1][k+1][j]+mapp[k][j]);
            }
        printf("Case #%d:\n%d\n",++cnt,max(dp[0][1][m],dp[1][1][m]));
    }
    return 0;
}
时间: 2024-10-17 12:47:33

hdu 4826 三维dp的相关文章

HDU 4826 简单DP

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

hdu 4826 Labyrinth(dp)

题目链接:hdu 4826 Labyrinth 题目大意:中文题. 解题思路:不难想的递推,dp[i][j][0]从上面过来的情况,dp[i][j][1]从下面过来的情况,然后这两种情况都可以从前一列走过来. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int INF = 0x3f3f3f3f; int n,

HDU 4826 (分类DP)

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1368    Accepted Submission(s): 574 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,

HDU 4433 locker(三维dp)

这题不太好想啊....我以为是记忆化搜索但是感觉最后的状态不好转移啊.别人都是用三维dp写的,感觉很巧啊. binshen写的:http://www.cnblogs.com/kuangbin/archive/2012/10/27/2742672.html 这题的意思就相当于是一个数字密码锁. 每次可以正向或者反向旋转连续的1-3个数字.求从现在状态转到目标状态需要的最少步数. 题目给了两个长度一样的由0-9组成的字符串.就相当于每次操作可以选择连续的1-3个数字加1或者减1.这不过这个加和减是循

hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea

hdu 3853 概率DP 简单

http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有R*C个格子,一个家伙要从(0,0)走到(R-1,C-1) 每次只有三次方向,分别是不动,向下,向右,告诉你这三个方向的概率,以及每走一步需要耗费两个能量,问你走到终点所需要耗费能量的数学期望: 回头再推次,思想跟以前的做过的类似 注意点:分母为0的处理 #include <cstdio> #include <cstring> #include <algorithm>

HDU 4968 (水dp 其他?)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

hdu 4123 树形DP+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=4123 Problem Description Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses,

HDU 3853 概率dp

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 2337    Accepted Submission(s): 951 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl).Homura wants to help he