Labyrinth
Labyrinth
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 152????Accepted Submission(s): 76
每組數(shù)據(jù)的第一行輸入兩個(gè)正整數(shù)m,n(m<=100,n<=100)。接下來的m行,每行n個(gè)整數(shù),分別代表相應(yīng)格子中能得到金幣的數(shù)量,每個(gè)整數(shù)都大于等于-100且小于等于100。
每組測試數(shù)據(jù)輸出一行,輸出一個(gè)整數(shù),代表根據(jù)最優(yōu)的打法,你走到右上角時(shí)可以獲得的最大金幣數(shù)目。
– 資格賽
題目:http://acm.hdu.edu.cn/showproblem.php?pid=4826
思路:搜索的話,搜索空間太大,耗時(shí)太多。
DP:問題有最優(yōu)子結(jié)構(gòu)的性質(zhì)。題目中說可以向右或者上下走,但是不能重復(fù)走,所以從左向右更新,但是只能從上往下或者從下往上單向更新。
代碼有點(diǎn)冗余,可能是因?yàn)椴唤?jīng)常練習(xí)。
還有就是dp數(shù)組可以開成一維的。
#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;
? ? }
}
總結(jié)
- 上一篇: 压力测试标准
- 下一篇: 算法题3 二分查找法