2014百度之星資格賽——1004 Labyrinth(dp)

Labyrinth

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


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
/* ***********************************************
Author        :小蔡虎
Created Time  :2014/5/
File Name     :E:\2014ACM\HDU\百度之星\資格賽1004
************************************************ */
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#define max(a,b) a>b? a:b
#define PI 3.141592654
#define MA 105
#define inf 9999999
using namespace std;
/*
*/
int a[MA][MA];
int dp1[MA][MA];
int dp2[MA][MA];
int dp[MA][MA],n,m;
void solve()
{
    int i,j;
    for(i=0; i<m; i++)
        dp[i][0]=-inf;
    dp[0][0]=a[0][0];
    for(j=0; j<n; j++)
    {
        //更新往下走或左往右的最值:
        dp1[0][j]=dp[0][j];//第一行只能左往右走;
        for(i=1; i<m; i++)
        {
            dp1[i][j]=max(dp[i][j],dp1[i-1][j]+a[i][j]);//選擇左→→右或上↓下,取其優;
        }
        //更新從下往上走或左往右走的最值:
        dp2[m-1][j]=dp[m-1][j];//最後一行只能往上走;
        for(i=m-2; i>=0; i--)
        {
            dp2[i][j]=max(dp[i][j],dp2[i+1][j]+a[i][j]);//選擇→或↑,取其優;
        }
        //更新此列最終狀態和確定下一列初始狀態:
        for(i=0; i<m; i++)
        {
            dp[i][j]=max(dp1[i][j],dp2[i][j]);//從dp1和dp2中選擇最優的;
            dp[i][j+1]=dp[i][j]+a[i][j+1];//確定下一列的初始值;
        }
    }
        printf("%d\n",dp[0][n-1]);
}
void input()
{
    int i,j;
    scanf("%d%d",&m,&n);
    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            scanf("%d",&a[i][j]);
}
int main()
{
    int T,k=1;
    scanf("%d",&T);
    while(T--)
    {
        printf("Case #%d:\n",k++);
        input();
        solve();
        //output();
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章