POJ 2111
记忆化搜索即可,设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的更多相关文章
- POJ 2111 DP+记录路径
题意: 思路: 类似滑雪 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm& ...
- 专题1:记忆化搜索/DAG问题/基础动态规划
A OpenJ_Bailian 1088 滑雪 B OpenJ_Bailian 1579 Function Run Fun C HDU 1078 FatMouse and Chee ...
- POJ 2442 Sequence【堆】
题目链接:http://poj.org/problem?id=2442 题目大意:给出一个m*n的矩阵,从每一行中取出一个数相加.能得到n^m个不同的结果.要求输出当中前n项. 建立一个以n元数组为底 ...
- poj和hdu部分基础算法分类及难度排序
最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- margin 百分比是按參照物来计算滴 不知道吧?
<style> #demo{ margin: 0 auto; width: 1000px; height: 500px; background: #eee; overflow: hidde ...
- 各种JSON的maven引用
一.jackjson maven <jackjson.version>2.8.8</jackjson.version> <dependency> <group ...
- DDos攻击篇
DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 1.1. SY ...
- 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 ...
- new一个接口
首先我们先看看接口的定义: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方 ...
- MongoDB Master-Slave cluster with authentication setup
Master Server create mongo db folder with sub folders like data, conf, && log mkdir -p /opt/ ...
- tinyxml使用
1.下载地址 http://sourceforge.net/projects/tinyxml/ 2.tinyxml不仅支持Linux编译,同时也支持windows下编译,由于tinyxml仅有6个文件 ...
- C#控制台显示进度条
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Prog ...
- vuejs开发H5页面总结
最近参与了APP内嵌H5页面的开发,这次使用vuejs替代了jQuery,仅仅把vuejs当做一个库来使用,效率提高之外代码可读性更强,在此分享一下自己的一些开发中总结的经验. 关于布局方案 当拿到设 ...
- flex知识点精炼
原址:http://www.runoob.com/w3cnote/flex-grammar.html 容器的属性 设置Flex布局之后,子元素的float.clear.vertical align将失 ...