HDU 1078 FatMouse and Cheese
2016-01-20 10:37
337 查看
简单DP
因为一定是小的数字推到大的数字,所以排序,转化成线性的DP
因为一定是小的数字推到大的数字,所以排序,转化成线性的DP
#include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<vector> #include<string> #include<iostream> #include<algorithm> using namespace std; const int maxn=100+10; int a[maxn][maxn],b[maxn][maxn]; int n,k; struct X { int r,c; int val; } s[maxn*maxn]; int dp[maxn*maxn]; bool cmp(const X&a,const X&b) { return a.val<b.val; } int main() { while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1) break; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { s[i*n+j].r=i; s[i*n+j].c=j; scanf("%d",&s[i*n+j].val); a[i][j]=s[i*n+j].val; } } sort(s,s+n*n,cmp); for(int i=0;i<n*n;i++) b[s[i].r][s[i].c]=i; for(int i=0;i<n*n;i++) dp[i]=-1; int pos; for(int i=0;i<n*n;i++) if(s[i].r==0&&s[i].c==0) {pos=i;break;} dp[pos]=s[pos].val; int ans=dp[pos]; for(int i=pos;i<n*n;i++) { if(dp[i]==-1) continue; int R=s[i].r; int C=s[i].c; for(int j=R-k;j<=R+k;j++) { if(j<0||j>=n) continue; if(a[j][C]<=a[R][C]) continue; if(dp[i]+a[j][C]>dp[b[j][C]]) { dp[b[j][C]]=dp[i]+a[j][C]; ans=max(ans,dp[b[j][C]]); } } for(int j=C-k;j<=C+k;j++) { if(j<0||j>=n) continue; if(a[R][j]<=a[R][C]) continue; if(dp[i]+a[R][j]>dp[b[R][j]]) { dp[b[R][j]]=dp[i]+a[R][j]; ans=max(ans,dp[b[R][j]]); } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- CodeIgniter多语言实现方法详解
- webrtc agc
- iOS -字符串替换 富文本的简单使用
- C3p0配置Mysql失效
- (一)、认识 hadoop
- selector状态
- Android47_传感器Sensor
- 细述Web技术与Native App共存的这10年
- 使用System.arraycopy()实现数组之间的复制
- js-RSA加密解密
- Spring注解详解
- Android 利用 aapt 解析 apk 得到应用名称 包名 版本号 权限等信息
- nova cell配置
- pycurl 使用 跳转
- XSD文件详解
- iOS新浪微博 微信好友、微信朋友圈、QQ自身sdk分享方法
- error C2065: “SurfFeatureDetector”: 未声明的标识符
- linux select 多路复用机制
- Android46_摄像头
- Android45_JPush极光推送及ShareSDK