HDU 1078 FatMouse and Cheese (记忆化dp)

来源:互联网 发布:linux 守护进程 服务器 编辑:程序博客网 时间:2024/06/04 01:29

思路:

  1. 注意读题:每次胖老鼠跑路都只能上下左右的跑一条直线。
  2. 由于只能由小的走向大的,所以我们可以逆向递推。就跟松塔一样。
#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;}
阅读全文
1 0
原创粉丝点击