首页 > 代码库 > HDU 1078 FatMouse and Cheese(简单DP)
HDU 1078 FatMouse and Cheese(简单DP)
解题思路:
很水的DP,记得按照权值大小排序即可。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #define LL long long #define FOR(i,x,y) for(int i=x;i<=y;i++) using namespace std; const int maxn = 100 + 10; struct Node { int x; int y; int w; bool operator < (const Node &rhs)const { return w < rhs.w; } }nodes[maxn*maxn]; int W[maxn][maxn]; int dp[maxn][maxn]; int N, K, M; int main() { while(scanf("%d%d", &N,&K)!=EOF) { if(N == -1 && K == -1) break; M = 0; FOR(i,1,N) { FOR(j,1,N) { scanf("%d", &W[i][j]); nodes[++M].x = i; nodes[M].y = j; nodes[M].w = W[i][j]; } } memset(dp,-1,sizeof(dp)); dp[1][1] = W[1][1]; int ans = -1; sort(nodes+1, nodes+1+M); FOR(i,1,M) { int x = nodes[i].x; int y = nodes[i].y; for(int xx=max(1,x-K);xx<=min(N,x+K);xx++) { if(W[x][y] > W[xx][y] && dp[xx][y] != -1) { dp[x][y] = max(dp[x][y], dp[xx][y] + W[x][y]); } } for(int yy=max(1,y-K);yy<=min(N,y+K);yy++) { if(W[x][y] > W[x][yy] && dp[x][yy] != -1) { dp[x][y] = max(dp[x][y], dp[x][yy] + W[x][y]); } } ans = max(ans , dp[x][y]); } printf("%d\n", ans); } return 0; }
HDU 1078 FatMouse and Cheese(简单DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。