POJ2111 Millenium Leapcow

题解:

类似滑雪,只不过增加了最小路径输出

路径如何输出?

以递归形式保存在路径中,最后保存最终解的开始点,然后递归输出

如何最小路径?贪心,使得每个点能走的最长路径最长,在相同的情况下记录最小前驱

代码:

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define LL long long
#define CLR(x) memset(x,0,sizeof x)
#define MC(x,y) memcpy(x,y,sizeof(x))
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=200100;
const int mod=1e9+7;
const int INF=1e9;

int M[370][370],dp[370][370];
P path[370][370];
vector<P> v;
int n;

int dx[8]={1,1,2,2,-1,-1,-2,-2};
int dy[8]={-2,2,-1,1,2,-2,1,-1};

int DP(int x,int y)
{
    int &m=dp[x][y];
    if(m)  return m;
    m=1;
    for(int i=0;i<8;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&M[nx][ny]>M[x][y])
        {
            if(DP(nx,ny)+1>m)
            {
                m=DP(nx,ny)+1;
                path[x][y]=mp(nx,ny);
            }
            else if(DP(nx,ny)+1==m&&M[path[x][y].fs][path[x][y].se]>M[nx][ny]) path[x][y]=mp(nx,ny);
        }
    }
    return m;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++) scanf("%d",&M[i][j]);
    int Max=1;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(Max<DP(i,j))
        {
            Max=DP(i,j);
            v.clear();
            v.pb(mp(i,j));
        }
        else if(Max==DP(i,j)) v.pb(mp(i,j));
    }
    int key,keyx,keyy;
    key=INF;
    for(int i=0;i<v.size();i++)
    {
        if(key>M[v[i].fs][v[i].se])
        {
            key=M[v[i].fs][v[i].se];
            keyx=v[i].fs;
            keyy=v[i].se;
        }
    }
    printf("%d\n",Max);
    while(true)
    {
        printf("%d\n",key);
        int fis=path[keyx][keyy].fs,sec=path[keyx][keyy].se;
        keyx=fis;keyy=sec;
        key=M[keyx][keyy];
        if(!keyx) break;
    }
    return 0;
}
时间: 2024-08-04 17:15:43

POJ2111 Millenium Leapcow的相关文章

poj 2111 Millenium Leapcow(记忆化搜索)

Description The cows have revised their game of leapcow. They now play in the middle of a huge pasture upon which they have marked a grid that bears a remarkable resemblance to a chessboard of N rows and N columns (3 <= N <= 365). Here's how they se

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

linux端口详解

以下内容摘自网络,来源不清了,做个备份吧: 0|无效端口,通常用于分析操作系统 1|传输控制协议端口服务多路开关选择器 2|管理实用程序 3|压缩进程 5|远程作业登录 7|回显 9|丢弃 11|在线用户 13|时间 17|每日引用 18|消息发送协议 19|字符发生器 20|FTP文件传输协议(默认数据口) 21|FTP文件传输协议(控制) 22|SSH远程登录协议 23|telnet(终端仿真协议),木马Tiny Telnet Server开放此端口 24|预留给个人用邮件系统 25|SMT

myEclipse6.5注册码生成

1 import java.text.DecimalFormat; 2 import java.text.NumberFormat; 3 import java.text.SimpleDateFormat; 4 import java.util.Calendar; 5 6 public class MyEclipseCrack { 7 // 8 public static final void main(String[] args) { 9 //Subscriber 10 String id =

计算机端口详解

你说的几万个端口是指的TCP/IP协议中使用的端口吧? TCP/IP协议族中使用16bit的端口号,所以TCP和UDP协议一共可使用65536个端口来传送数据,有一部分有标准功能定义,但也不是不能修改的. 任何TCP/IP实现所提供的服务都用知名的1-1023之间的端口号.这些知名端口号由Internet号分配机构( Internet Assigned Numbers Authority, IANA)来管理. [TCP/IP常用端口说明] 端口:0 服务:Reserved 说明:通常用于分析操作

myeclipse trial expired[转]

转自:http://blog.csdn.net/yuyuyuyuy/article/details/5878122 今天MyEclipse提示过期了,MyEclipse Trial Expired. 网上找到了一个注册类可以生成Myeclipse注册码. import java.io.*; public class MyEclipseGen { private static final String LL = "Decompiling this copyrighted software is a

Myeclipse7.5 下载 安装 注冊 注冊码 100%成功

myeclipse7.5启动画面 1.下载Myeclipse官方原版 官方原版:或者 http://downloads.myeclipseide.com/downloads/products/eworkbench/7.0/myeclipse-7.5.0-win32.exe; 2.安装Myeclipse 注意,Myeclipse7.5对国内进行的封锁,所以必须通过vpn代理北美的独立vpn安装, 1)下载免费vpn工具(超级简单)Hotspot Shield Hotspot Shield :或者