nyoj 探寻宝藏
探 尋 寶 藏
時間限制:1000?ms ?|? 內存限制:65535?KB 難度:5 描述傳說HMH大沙漠中有一個M*N迷宮,里面藏有許多寶物。某天,Dr.Kong找到了迷宮的地圖,他發現迷宮內處處有寶物,最珍貴的寶物就藏在右下角,迷宮的進出口在左上角。當然,迷宮中的通路不是平坦的,到處都是陷阱。Dr.Kong決定讓他的機器人卡多去探險。
但機器人卡多從左上角走到右下角時,只會向下走或者向右走。從右下角往回走到左上角時,只會向上走或者向左走,而且卡多不走回頭路。(即:一個點最多經過一次)。當然卡多順手也拿走沿路的每個寶物。
Dr.Kong希望他的機器人卡多盡量多地帶出寶物。請你編寫程序,幫助Dr.Kong計算一下,卡多最多能帶出多少寶物。輸入接下來對每組測試數據:
第1行: M N
第2~M+1行: Ai1 Ai2 ……AiN (i=1,…..,m)
【約束條件】
2≤k≤5 1≤M, N≤50 0≤Aij≤100 (i=1,….,M; j=1,…,N)
所有數據都是整數。 數據之間有一個空格。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a[60][60];
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
int step=m+n-2;
int dp[120][60][60];
memset(dp,0,sizeof(dp));
for(int s=1;s<step;s++)
for(int i=1;i<=m;i++)
{
for(int j=i+1;j<=m;j++)
{
if(s+2>=i&&s+2>=j) //判斷坐標是否越界。+2是因為求步數的時候-2
dp[s][i][j]=max(max(dp[s-1][i-1][j],dp[s-1][i-1][j-1]),
max(dp[s-1][i][j],dp[s-1][i][j-1]))+a[i][s-i+2]+a[j][s-j+2];
}
}
cout<<max(dp[step-1][m-1][m],dp[step-1][m][m-1])+a[m][n]<<endl;
}
return 0;
}
思路:
本題的題意是:一個人從左上到右下,再到左上,兩次的路線不同,求兩次之和的寶藏數最大
則可以變更為兩人同時從左上到右下,路線不同。
A(x,y) B(i,j) 則 x+y=i+j;
兩人走的總步數相同,從左上到右下step=m+n-2;。坐標從1,1開始
果兩個人不走相同的路 那么這兩個人必須不在相同的列或者行
i表示第一個人所在的行坐標,j表示第二個人所在的列坐標。
?
轉載于:https://www.cnblogs.com/tianzeng/p/8719563.html
總結
- 上一篇: over partition by与gr
- 下一篇: Leetcode0037--Sudoku