思路:
注意读题:每次胖老鼠跑路都只能上下左右的跑一条直线。 由于只能由小的走向大的,所以我们可以逆向递推。就跟松塔一样。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
typedef long long int lli;
using namespace std ;
int ma[120 ][120 ];
lli dp[120 ][120 ];
int n,kk;
lli dfs(int i,int j){
lli ans = 0 ;
for (int x=-kk;x <= kk;x++){
if (i+x < 1 || i+x > n) continue ;
if (ma[i+x][j] > ma[i][j])
ans = max(ans,dp[i+x][j]);
}
for (int x=-kk;x <= kk;x++){
if (j+x < 1 || j+x > n) continue ;
if (ma[i][j+x] > ma[i][j])
ans = max(ans,dp[i][j+x]);
}
dp[i][j] = ma[i][j] + ans;
return dp[i][j];
}
struct node{
int i,j,v;
}a[10100 ];int cnte;
bool cmp(const node &a,const node &b){
return a.v > b.v;
}
int main(){
while (~scanf ("%d%d" ,&n,&kk),n!=-1 &&kk!=-1 ){
memset (dp,0 ,sizeof (dp));cnte = 0 ;
for (int i = 1 ;i <= n;i++){
for (int j = 1 ;j <= n;j++){
scanf ("%d" ,&ma[i][j]);
a[++cnte].i=i;a[cnte].j=j;a[cnte].v=ma[i][j];
}
}
int mm = n*n;lli ans = 0 ;
sort(a+1 ,a+1 +mm,cmp);
for (int i = 1 ;i <= mm;i++){
ans = max(ans,dfs(a[i].i,a[i].j));
if (a[i].i == 1 && a[i].j==1 ) break ;
}
printf ("%lld\n" ,dp[1 ][1 ]);
}
return 0 ;
}