程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu4826---Labyrinth(簡單dp)

hdu4826---Labyrinth(簡單dp)

編輯:C++入門知識

hdu4826---Labyrinth(簡單dp)


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 | We have carefully selected several similar problems for you: 5177 5173 5169 5168 5165

設dp[i][j][0-2]表示從三個方向進入(i, j)的最優值

/*************************************************************************
    > File Name: hdu4826.cpp
    > Author: ALex
    > Mail: [email protected] 
    > Created Time: 2015年02月26日 星期四 17時21分46秒
 ************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair  PLL;

int dp[110][110][3];
int mat[110][110];

int main ()
{
    int t;
    int icase = 1;
    scanf("%d", &t);
    while (t--)
    {
        int n, m;
        scanf("%d%d", &n, &m);
        memset (dp, -inf, sizeof(dp));
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= m; ++j)
            {
                scanf("%d", &mat[i][j]);
            }
        }
        dp[1][1][0] = dp[1][1][1] = dp[1][1][2] = mat[1][1];
        for (int i = 2; i <= n; ++i)
        {
            dp[i][1][0] = dp[i - 1][1][0] + mat[i][1];
        }
        for (int j = 2; j <= m; ++j)
        {
            for (int i = 1; i <= n; ++i) //從左邊進入
            {
                dp[i][j][2] = max (dp[i][j - 1][0], max (dp[i][j - 1][1], dp[i][j - 1][2])) + mat[i][j];
            }
            for (int i = 2; i <= n; ++i)
            {
                dp[i][j][0] = max (dp[i - 1][j][0], dp[i - 1][j][2]) + mat[i][j];
            }
            for (int i = n - 1; i >= 1; --i)
            {
                dp[i][j][1] = max (dp[i + 1][j][2], dp[i + 1][j][1]) + mat[i][j];
            }
        }
        int ans = max (dp[1][m][0], max (dp[1][m][1], dp[1][m][2]));
        printf("Case #%d:\n", icase++);
        printf ("%d\n", ans);
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved