8636 跳格子
看到也有人写过这道题题解,不过使用搜索+记忆化的,我这里提供一个纯动态规划的思路。
1.确定状态,首先,它肯定跳到了最后一列格子上,至于哪个格子我先不管。
2.那么它是怎么跳过来的呢?它是通过距离它根号k的范围内跳过来的,那我要使得我最后跳下去是最大的,那我我就要这个范围里面选一个最大的,这样
我的状态转移方程就是dp[i][j]=max(范围内dp[][]最大值)+a[i][j]。
3.最后再遍历一遍最后一列,选最大的就好了
#include <stdio.h>
#include <math.h>
#include <limits.h>
#define MAXN 10000+500
long long dp[MAXN][MAXN];
long long a[MAXN][MAXN];
int main()
{
int kase;
scanf("%d",&kase);
while(kase--)
{
int n, m;
scanf("%d%d",&n,&m);
int k;
scanf("%d",&k);
int i, j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%lld",&a[i][j]);
for(i=0;i<n;i++)
dp[i][0]=a[i][0];
int h, l;
for(j=1;j<m;j++)
{
for(i=0;i<n;i++)
{
int max=-INT_MAX;
int temp=j-(int)sqrt(k)>0?j-(int)sqrt(k)>0:0;
for(h=temp;h<j;h++)
{
for(l=0;l<n;l++)
{
if((l-i)*(l-i)+(h-j)*(h-j)>k)
continue;
else
{
if(dp[l][h]>max)
max=dp[l][h];
}
}
}
dp[i][j]=max+a[i][j];
}
}
int max=-INT_MAX;
for(i=0;i<n;i++)
{
if(dp[i][m-1]>max)
max=dp[i][m-1];
}
printf("%d\n",max);
}
return 0;
}