Hdu 1078
来源:互联网 发布:西地那非粉50克淘宝 编辑:程序博客网 时间:2024/06/14 21:56
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1078
题目大意:
有一只老鼠,起始点在(0,0),起始获得一个权值,每次可以水平或垂直的至多走k步,获得该处的权值,且每次获得的权值必须比上一次的大,求最大能获得的总权值是多少
分析:
起点固定在(0,0),所以可以选dp[0][0]为dp终点,一开始以为是两点之间曼哈顿距离在k之内可达,后面一直WA,看了题解发现是题意读错了,只能上下或者左右走k步,所以结构体保存行列和权值信息,然后按权值从大到小,权值较大的先遍历,dp[i][j]表示以矩阵中(i,j)位置为起点能获得的最大权值和,dp转移式是
最后
代码:
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#include<math.h>using namespace std;typedef long long ll;const int maxn = 1020000;const ll INF = 0x3f3f3f3f3f3f3f3f;int n,k;int mat[120][120];int dp[120][120];struct Node{ int v,r,c; bool operator < (const Node a) { return v>a.v; }}arr[12000];bool check(int i ,int j){ if (i<1||i>n||j<1||j>n) return false; else return true;}int main(){ int t = 1 ; while (~scanf("%d%d",&n,&k)) { if (n==-1&&k==-1) break; for (int i = 1; i <= n ; i ++) { for (int j = 1 ; j <= n ; j ++) { scanf("%d",&mat[i][j]); dp[i][j] = mat[i][j]; arr[(i-1)*n+j].r = i; arr[(i-1)*n+j].c = j; arr[(i-1)*n+j].v = mat[i][j]; } } sort(arr+1,arr+n*n+1); int x,y; for (int i = 1 ; i <= n*n ; i ++) { x = arr[i].r , y = arr[i].c; for (int p = -k ; p <= k ; p ++) { if (check(x+p,y)&&mat[x+p][y]>mat[x][y]) dp[x][y] = max(dp[x][y],dp[x+p][y]+mat[x][y]); if (check(x,y+p)&&mat[x][y+p]>mat[x][y]) dp[x][y] = max(dp[x][y],dp[x][y+p]+mat[x][y]); } } printf("%d\n",dp[1][1]); } return 0;}
阅读全文
0 0
- hdu 1078
- HDU 1078
- hdu 1078
- HDU-1078
- Hdu 1078
- hdu 1078
- HDU 1078
- HDU 1078
- hdu 1078+hdu1978+hdu 1428
- joj 1078 hdu 1116
- hdu 1078 动态规划
- hdu 1078 搜索
- hdu 1078(dfs+dp)
- HDU 1078 深搜+DP
- HDU 1078(贪心)
- hdu 1078 FatMouse Chees
- HDU 1078(搜索)
- hdu
- 仿QQ空间评论随软键盘弹出和收回一个输入布局
- LoadImageAsyncTask
- Linux简介
- [cmake] 使用静态库archive文件
- python学习笔记(一)
- Hdu 1078
- CMD命令整理
- toj4168 I-The brute force problem
- 【spring】IOC
- <mvc:annotation-driven>
- caffe win10 vs13 lenet训练 cpu
- LINUX系统中断处理结构及中断函数的实现
- HashMap知识要点
- CCF 201312-5 I’m stuck!