這裏算不上dp吧.直接輸入設置就能行了.
描述
這次,OI山成爲了雷曼兔那無盡的冒險傳說的新舞臺!傳說OI山中埋藏着巨大的寶藏,伴隨着這個傳說的是一個迷題:最瑰麗的舞者將達至精靈世界的彼岸……
經過仔細推敲,雷曼兔發現這是一個提示寶藏埋藏位置的謎語,在該謎語中指出了一個特定的路徑,只有經過了該路徑寶藏纔會出現,具體情況如下:
OI山的地勢圖可以看作一個N*N的數字矩陣,由1-N^2的數字組成(每個數字出現且僅出現一次),這些數字表示每個地點的地勢高低。雷曼兔的出發點在最高的山頂處,並且每次雷曼兔可以從其當前所在的位置跳躍到任何一個比當前地點高度低的位置,假設雷曼兔該次跳躍從座標(x1,y1)跳到了座標(x2,y2),則這次跳躍的華麗度定義爲v=(|x1-x2|+|y1-y2|)^2。而開啓寶藏祕密的路徑就是從山頂不斷跳躍直到山底(高度最低點)的華麗度總和最高的路徑,而現在我們想要知道的是這個最高的華麗度總和是多少
格式
輸入格式
第一行包括一個整數n(n<=50)表示地圖的長寬。
接下來n行每行包括n個數表示每個地點的高度。
輸出格式
輸出包括一個整數ans,表示從山頂到山底最高華麗度總和
#include <iostream>
#include<cmath>
using namespace std;
int i,j,n,it,mb,temp;
int x[2800],y[2800],num[2800];
void init()
{
cin >> n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin >> it;
x[it]=i;//這裏太明智了,直接第幾個就設置成第幾個
y[it]=j;
}
}
int main()
{
init();//對座標進行設置。num[n*n]=0;
for(i=n*n-1;i>=1;i--)
{
mb=0;
for(j=i+1;j<=n*n;j++)
{
temp=num[j]+( abs(x[j]-x[i])+abs(y[j]-y[i]) )*( abs(x[j]-x[i])+abs(y[j]-y[i]) );
if(temp>mb) mb=temp;
//cout<<num[j]<<" ";
}
num[i]=mb;
}
cout << num[1] << endl;
return 0;
}
https://vijos.org/p/1474