Labyrinth

来源:互联网 发布:cf辅助软件大全 编辑:程序博客网 时间:2024/05/06 20:23

Labyrinth

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

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
23 41 -1 1 02 -2 4 23 5 1 -902 21 11 1
 


Sample Output
Case #1:18Case #2:4
 


Source
2014年百度之星程序设计大赛
– 资格赛
 

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4826


思路:搜索的话,搜索空间太大,耗时太多。

DP:问题有最优子结构的性质。题目中说可以向右或者上下走,但是不能重复走,所以从左向右更新,但是只能从上往下或者从下往上单向更新。



代码有点冗余,可能是因为不经常练习。

还有就是dp数组可以开成一维的。



#include <bits/stdc++.h>
using namespace std;
#define MAXN 101
#define MIN -110000000
int dp[MAXN][MAXN] ;
int arr[MAXN][MAXN];
int main(){


    int N;
    cin >>N;
    int NN = N ;
    while (N-- > 0){
        int m , n ;
        cin>>m>>n;
        for(int i =0 ; i < m ; ++i){
            for(int j = 0 ; j < n ; ++j){
                cin>>arr[i][j];
                dp[i][j] = MIN;
            }
        }
        for (int j = 0 ; j < n ;++j)
        {
            if (j!=0 && j != n-1){
                for (int i = 0 ; i < m ; ++i){


                    dp[i][j] = dp[i][j-1]+arr[i][j];
                    if(i != 0)
                    dp[i][j] = max(dp[i][j] ,dp[i-1][j]+arr[i][j]);
                }
                int dptemp[MAXN];
                for (int i = m-1 ; i >= 0  ; --i){
                    dptemp[i] = dp[i][j-1]+arr[i][j];
                   if (i!=m-1){
                    dptemp[i] = max(dptemp[i] , dptemp[i+1]+arr[i][j]);
                   }
                }
                for (int i = 0 ; i < m ; ++i)
                    dp[i][j] = max(dp[i][j] , dptemp[i]);
            }else {
                if (j==0){
                        dp[0][0] =arr[0][0];
                     for (int i = 0 ; i < m ; ++i){
                    //dp[i][j] = max(dp[i][j-1]+arr[i][j];
                    if(i != 0)
                    dp[i][j] = max(dp[i][j] ,dp[i-1][j]+arr[i][j]);
                }
                }else{
                 for (int i = m-1 ; i >= 0  ; --i){
                    dp[i][j] = max(dp[i][j-1]+arr[i][j],dp[i][j]);
                    if(i != m-1)
                    dp[i][j] = max(dp[i][j] ,dp[i+1][j]+arr[i][j]);
                }


                }


            }
        }
//        for (int i = 0 ; i < m ; ++i){
//            for(int j =0 ; j < n ; ++j){
//                cout<<dp[i][j];
//            if (j==n-1)
//                cout<<endl;
//            else
//                cout<<" ";
//            }
//               }
         cout<<"Case #"<<NN-N<<":"<<endl;
         cout<<dp[0][n-1]<<endl;
    }


}

0 0
原创粉丝点击