题目:点击打开链接
题意:老鼠能从上下左右四个方向走1 至 k长度吃到奶酪,但只能往多了吃不能吃了多的再吃少的,问所能吃到奶酪最大值
解法:结构体排序+dp,条件中应有if (dp[i][j]) 表示该点走过 ,没走过不能往下执行
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
struct sa
{
int x,y,z;
}data[10010];
int cmp(sa a,sa b)
{
return a.z<b.z;
}
int main()
{
int n,k,b,a[105][105],dp[105][105],ans,xx,yy;
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1) break;
b=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
b++;
data[b].x=i;
data[b].y=j;
data[b].z=a[i][j];
}
sort(data+1,data+1+n*n,cmp);
dp[1][1]=a[1][1];
for(int i=1;i<=n*n;i++)
{
xx=data[i].x;
yy=data[i].y;
for(int j=-k;j<=k;j++)
{
if(j==0) continue;
if(xx+j>=1&&xx+j<=n&&a[xx][yy]>a[xx+j][yy]&&dp[xx+j][yy]) dp[xx][yy]=max(dp[xx][yy],dp[xx+j][yy]+a[xx][yy]);
if(yy+j>=1&&yy+j<=n&&a[xx][yy]>a[xx][yy+j]&&dp[xx][yy+j]) dp[xx][yy]=max(dp[xx][yy],dp[xx][yy+j]+a[xx][yy]);
}
}
ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans=max(ans,dp[i][j]);
printf("%d\n",ans);
}
return 0;
}