基準(zhǔn)時(shí)間限制:2 秒 空間限制:131072 KB 分值: 80 難度:5級(jí)算法題
收藏
關(guān)注一個(gè)M*N矩陣中有不同的正整數(shù),經(jīng)過(guò)這個(gè)格子,就能獲得相應(yīng)價(jià)值的獎(jiǎng)勵(lì),先從左上走到右下,再?gòu)挠蚁伦叩阶笊稀5?遍時(shí)只能向下和向右走,第2遍時(shí)只能向上和向左走。兩次如果經(jīng)過(guò)同一個(gè)格子,則該格子的獎(jiǎng)勵(lì)只計(jì)算一次,求能夠獲得的最大價(jià)值。 例如:3 * 3的方格。1 3 32 1 32 2 1能夠獲得的最大價(jià)值為:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起點(diǎn)和終點(diǎn)的獎(jiǎng)勵(lì)只計(jì)算1次。Input第1行:2個(gè)數(shù)M N,中間用空格分隔,為矩陣的大小。(2 <= M, N <= 200)第2 - N + 1行:每行M個(gè)數(shù),中間用空格隔開(kāi),對(duì)應(yīng)格子中獎(jiǎng)勵(lì)的價(jià)值。(1 <= A[i,j] <= 10000)Output輸出能夠獲得的最大價(jià)值。Input示例3 31 3 32 1 32 2 1Output示例17
#include<cstdio>#include<iostream>#define MAX(a,b,c,d) max(max(a,b),max(c,d))using namespace std;int n,m,a[201][201],dp[401][201][201]={0};int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); for(int k=2;k<=n+m;k++) for(int i=1;i<=n&&k-i>0;i++) for(int j=1;j<=n&&k-j>0;j++) dp[k][i][j]=max(dp[k][i][j], MAX(dp[k-1][i][j],dp[k-1][i-1][j-1],dp[k-1][i-1][j],dp[k-1][i][j-1])+a[i][k-i]+(i==j?0:a[j][k-j])); PRintf("%d/n",dp[n+m][n][n]); return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注