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 4
1 -1 1 0
2 -2 4 2
3 5 1 -90
2 21 1
1 1sample output
case #1:
18case #2:
4對於乙個點能夠從三個方向到達,從上,從左,從下。
由於乙個點不能走多次,我們能夠得到乙個非常easy的結論。假設從上到達這個點,那麼之後我們就僅僅能向下,或者向右走了。從下到達類似。
僅僅有從左到達,三個方向都能夠走。
這裡dp[i][j][k]表示x,y這個點從k這個方向過來的最大值。當中k=0,1,2.0表示從左邊到達該點,1表示從上面到達該點,2表示從以下到達該點。
依據以上結論,能夠得到乙個非常easy的狀態轉移方程:
dp[i][j+1][0] = max(,dp[i][j][0],dp[i][j][1],dp[i][j][2])+ graph[i][j+1];
dp[i+1][j][1] =max(dp[i][j][0],dp[i][j][1]) + graph[i+1][j];
dp[i-1][j][2] =max(dp[i][j][0],dp[i][j][2]) + graph[i-1][j];
由以上轉移方程非常easy得到。我們能夠對每一列,先從上到向下更新該點向下走所到達點的值,再從下到上更新該點向上和向右分別到達點的值。
最後的答案就是從左到達和從以下到達右上方的點的最大值。
#include#include#include#include#include#include#include#include#define eps 1e-8
#define max 100010
#define inf 99999999
#define mod 1000000007
#define mem(a) memset(a,-1,sizeof(a))
#define mem1(a) memset(a,0,sizeof(a))
#define zero(x) ( x > +eps ) - ( x < -eps )
using namespace std;
struct node
;int dp[110][110][3];
int n ,m;
int graph[110][110];
int main()
}for(int i = 0;i <= n +1;i++)
}dp[1][1][1] = dp[1][1][0] = graph[1][1];
for(int i = 1;i <= n;i++)
for(int i = 2;i <= m;i++)
for(int j = n;j >= 1;j--)
}printf("%d\n",max(dp[1][m][0],dp[1][m][2]));
}return 0;
}
2023年百度之星程式設計大賽 資格賽
主要是卡了一下 接下來2題還在做 都有思路 考慮全然即可了 include include using namespace std int main if k 1 m v m v k m int sum 0 while m n m 0 if m 0 m n sum 1 printf d n sum ...
百度之星資格賽
1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...
2016 百度之星 資格賽
變懶了,最近做的很多題目都不想貼了。本來就sb,還那麼懶,沒救了。a沒想太多,設個逆元就過了。b斐波那契數列高精度。n 0時輸出換行。c字典樹,記錄結點的單詞數 以及 當前結點是否是單詞的末尾,delete時需要先找出字首對應的串數,那麼就dfs統計末尾結點總數,然後用字首減掉就好了。一開始dfs跑...