记忆化搜索即可,设DP[I][J]为可到达的最大步数。

输出时用了一种较笨拙的方法,还有一种方法是使用最长上升子序列的方式,挺好,先排序,这让我想起上次BESTCODER的一题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std;
const int N=370;
struct {
int x,y;
}que[N*N],dir[8];
int num[N][N];
int dp[N][N];
int n,tf,f,l; bool ok(int x,int y,int i,int j){
if(x>=1&&x<=n&&y>=1&&y<=n){
if(num[x][y]>num[i][j])
return true;
}
return false;
} void dfs(int i,int j){
int tx,ty;
if(dp[i][j]!=-1) return ;
dp[i][j]=1;
for(int k=0;k<8;k++){
tx=i+dir[k].x;
ty=j+dir[k].y;
if(ok(tx,ty,i,j)){
dfs(tx,ty);
if(dp[i][j]==-1||dp[tx][ty]+1>dp[i][j])
dp[i][j]=dp[tx][ty]+1;
}
}
} int main(){
dir[0].x=2,dir[0].y=1;dir[1].x=2,dir[1].y=-1;
dir[2].x=-2,dir[2].y=1;dir[3].x=-2,dir[3].y=-1;
dir[4].x=1,dir[4].y=2; dir[5].x=-1;dir[5].y=2;
dir[6].x=1,dir[6].y=-2;dir[7].x=-1,dir[7].y=-2;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&num[i][j]);
dp[i][j]=-1;
}
}
f=l=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dp[i][j]==-1){
dfs(i,j);
if(f==l){
que[l].x=i,que[l].y=j;
l++;
}
else if(dp[i][j]>dp[que[l-1].x][que[l-1].y]||(dp[i][j]==dp[que[l-1].x][que[l-1].y]&&num[i][j]<num[que[l-1].x][que[l-1].y])){
l=f;
que[l].x=i,que[l].y=j;
l++;
}
else if(dp[i][j]==dp[que[l-1].x][que[l-1].y]&&num[i][j]==num[que[l-1].x][que[l-1].y]){
que[l].x=i,que[l].y=j;
l++;
}
}
}
}
printf("%d\n",dp[que[f].x][que[f].y]);
tf=f;f=l;
int tx,ty,x,y;
while(tf<f){
if(f==l){
printf("%d\n",num[que[tf].x][que[tf].y]);
}
x=que[tf].x; y=que[tf].y;
for(int i=0;i<=8;i++){
tx=x+dir[i].x;
ty=y+dir[i].y;
if(ok(tx,ty,x,y)){
if(dp[tx][ty]+1==dp[x][y]){
if(f==l){
que[l].x=tx,que[l].y=ty;
l++;
}
else if(dp[tx][ty]>dp[que[l-1].x][que[l-1].y]||(dp[tx][ty]==dp[que[l-1].x][que[l-1].y]&&num[tx][ty]<num[que[l-1].x][que[l-1].y])){
l=f;
que[l].x=tx,que[l].y=ty;
l++;
}
else if(dp[tx][ty]==dp[que[l-1].x][que[l-1].y]&&num[tx][ty]==num[que[l-1].x][que[l-1].y]){
que[l].x=tx,que[l].y=ty;
l++;
}
}
}
}
tf++;
if(tf==f){
tf=f; f=l;
}
}
}
return 0;
}

  

POJ 2111的更多相关文章

  1. POJ 2111 DP+记录路径

    题意: 思路: 类似滑雪 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm& ...

  2. 专题1:记忆化搜索/DAG问题/基础动态规划

      A OpenJ_Bailian 1088 滑雪     B OpenJ_Bailian 1579 Function Run Fun     C HDU 1078 FatMouse and Chee ...

  3. POJ 2442 Sequence【堆】

    题目链接:http://poj.org/problem?id=2442 题目大意:给出一个m*n的矩阵,从每一行中取出一个数相加.能得到n^m个不同的结果.要求输出当中前n项. 建立一个以n元数组为底 ...

  4. poj和hdu部分基础算法分类及难度排序

    最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...

  5. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  6. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  7. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  8. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  9. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. margin 百分比是按參照物来计算滴 不知道吧?

    <style> #demo{ margin: 0 auto; width: 1000px; height: 500px; background: #eee; overflow: hidde ...

  2. 各种JSON的maven引用

    一.jackjson maven <jackjson.version>2.8.8</jackjson.version> <dependency> <group ...

  3. DDos攻击篇

    DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 1.1. SY ...

  4. The Triangle--nyoj 18

    The Triangle 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...

  5. new一个接口

    首先我们先看看接口的定义: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方 ...

  6. MongoDB Master-Slave cluster with authentication setup

    Master Server create mongo db folder with sub folders like data, conf, && log mkdir -p /opt/ ...

  7. tinyxml使用

    1.下载地址 http://sourceforge.net/projects/tinyxml/ 2.tinyxml不仅支持Linux编译,同时也支持windows下编译,由于tinyxml仅有6个文件 ...

  8. C#控制台显示进度条

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Prog ...

  9. vuejs开发H5页面总结

    最近参与了APP内嵌H5页面的开发,这次使用vuejs替代了jQuery,仅仅把vuejs当做一个库来使用,效率提高之外代码可读性更强,在此分享一下自己的一些开发中总结的经验. 关于布局方案 当拿到设 ...

  10. flex知识点精炼

    原址:http://www.runoob.com/w3cnote/flex-grammar.html 容器的属性 设置Flex布局之后,子元素的float.clear.vertical align将失 ...