hdu 1098
来源:互联网 发布:js控制元素隐藏 编辑:程序博客网 时间:2024/06/06 09:28
FatMouse and Cheese
题意: 一个n * n的二维图,从最左上角出发,一次最多水平或者竖直的走k步,然后经过比他大的点,求加上所有经过的权之后最大的值;
思路: 知道起点,但不知道终点,记忆化搜索的时候就是以这个点作为输出点,从后往前推;
PS:记忆化搜索的时候一定不能在中间改变dp的值,只能在最后改;
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;typedef long long ll;const ll maxn = 200 + 10;#define INF 0x3f3f3f3fll a[maxn][maxn];ll dp[maxn][maxn];void Init(){memset(dp,-1,sizeof(dp));}ll derict[][2] ={-1,0,1,0,0,1,0,-1};ll n,k;ll work(ll x,ll y){if(dp[x][y] != -1)return dp[x][y];ll maxs =0;for(ll i = 1; i <= k; i ++){for(ll j = 0; j < 4; j ++){ll xx = x + derict[j][0] * i,yy = y + derict[j][1] * i;if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && a[x][y] < a[xx][yy]){maxs = max(maxs,work(xx,yy));}}}return dp[x][y] = maxs + a[x][y];}int main(){while( ~ scanf("%I64d%I64d",&n,&k)){if(n == -1 && k == -1)break;Init();for(ll i = 1; i <= n; i ++){for(ll j = 1; j <= n; j ++){scanf("%I64d",&a[i][j]);}}ll ans = work(1,1);cout << ans << endl;}return 0;}
0 0
- hdu 1098
- hdu 1098
- HDU 1098
- HDU 1098
- hdu-1098
- HDU 1098
- hdu 1098
- hdu 1098
- hdu 1098
- hdu 1098
- hdu 1098
- hdu 1098-二项式定理
- hdu 1098 数学
- 费马小定理 hdu 1098
- HDU 1098解题报告
- hdu 1098 数学归纳法
- HDU 1098 数学归纳法
- hdu
- PDO预处理--变量绑定
- 站位1
- 关于在eclipse中编译后的java小程序如何在命令行窗口运行的说明
- 体验angularjs(入门基础篇)
- 站位2
- hdu 1098
- 算法提高 12-1三角形
- 站位3
- 最小费用最大流 修改的dijkstra
- 懒加载异常说明及解决:could not initialize proxy-no Session
- 站位4
- shape绘制背景
- 动态加载拍照和本地图片并移除的方法
- 归并排序算法