题意:链接

方法: DP

解析:

第一眼搜索题,复杂度不同意dfs,并且牛的数量太多不能bfs,迭代更不可能,A*不会估价。可能记忆化?

等等记忆化我还搜个毛线…

直接改成DP就好了。

状态非常好想非常easy,可是这个路径简直….丧心病狂!

f[i][j][k]表示横向走了(i-31),纵向走了(j-31)用了k次的最大值。

所以我们要预处理map[i][j]表示横向走到(i-31),纵向走到(j-31),这么一下对答案的贡献。

然后我就要吐槽了。这个题假设你不处理一些奇怪的点,比方走到坐标为x,0或是0,y的地方是合法的。合法的!

所以题里那个>=1不是限制这个的?简直丧病!

然后就是欢快地搜路径辣。

到着搜全部路径。字典序的方向优先选用。

最后正着跑一边就好了。

说起来挺简单。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 35
#define INF 0x3f3f3f3f
using namespace std;
int n,m,k;
struct node
{
int x,y;
}pt[1010];
int f[N<<1][N<<1][N];
char pre[N<<1][N<<1][N];
int map[N<<1][N<<1];
int map_ori[1010][1010];
int xx[5]={0,-1,0,0,1};
int yy[5]={0,0,-1,1,0};
bool canbetheend[N][N];
char printout[N];
char comp[N];
char pick[N];
void init_map()
{
for(int i=0;i<=62;i++)
{
for(int j=0;j<=62;j++)
{
int basex,basey;
basex=i-31,basey=j-31;
int flag=0;
for(int l=1;l<=n;l++)
{
if(i==29&&j==30)
{
flag++;
flag--;
}
int x=pt[l].x,y=pt[l].y;
if(x+basex<=0||y+basey<=0||x+basex>1000||y+basey>1000){flag=1;continue;}
map[i][j]+=map_ori[x+basex][y+basey];
}
}
}
}
int main()
{
pick[1]='W',pick[2]='S',pick[3]='N',pick[4]='E';
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d%d",&pt[i].x,&pt[i].y);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map_ori[x][y]++;
}
init_map();
int ans=0;
for(int i=0;i<=k;i++)
{
for(int j=0;j<=62;j++)
{
for(int l=0;l<=62;l++)
{
f[j][l][i]=-INF,pre[j][l][i]='Z';
}
}
}
f[31][31][0]=0;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=61;j++)
{
for(int l=1;l<=61;l++)
{
f[j][l][i]=max(max(f[j-1][l][i-1],f[j][l-1][i-1]),max(f[j][l+1][i-1],f[j+1][l][i-1]))+map[j][l];
if(i==k)
{
if(f[j][l][i]>ans)
{
ans=f[j][l][i];
}
}
}
}
}
for(int i=1;i<=61;i++)
{
for(int j=1;j<=61;j++)
{
if(f[i][j][k]==ans)
{
pre[i][j][k]='A';
}
}
}
for(int l=k-1;l>=0;l--)
{
for(int i=1;i<=61;i++)
{
for(int j=1;j<=61;j++)
{
for(int o=1;o<=4;o++)
{
if(f[i][j][l]+map[i+xx[o]][j+yy[o]]==f[i+xx[o]][j+yy[o]][l+1]&&pre[i+xx[o]][j+yy[o]][l+1]<'Z')
{
pre[i][j][l]=pick[o];
}
}
}
}
} printf("%d\n",ans);
int li=31,lj=31;
for(int i=0;i<k;i++)
{
printf("%c",pre[li][lj][i]);
switch(pre[li][lj][i])
{
case 'E':li++;break;
case 'N':lj++;break;
case 'S':lj--;break;
case 'W':li--;break;
}
}
cout<<endl;
}

BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机 DP的更多相关文章

  1. BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机:dp【找转移路径】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1605 题意: 平面直角坐标系中,有n个点,m个标记(坐标范围1~1000). 你可以发出口 ...

  2. BZOJ1605 [Usaco2008 Open]Crisis on the Farm 牧场危机

    标题好长&&我是权限狗,汪汪! 题没看懂的我以为这是一道极难滴题目...然后,然后我就看懂题了. 数据少给了一个条件K <= 30...(没这条件还做个鬼...) f[k, i, ...

  3. BZOJ 1621: [Usaco2008 Open]Roads Around The Farm分岔路口

    题目 1621: [Usaco2008 Open]Roads Around The Farm分岔路口 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 56 ...

  4. BZOJ 1621 [Usaco2008 Open]Roads Around The Farm分岔路口:分治 递归

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1621 题意: 约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土 ...

  5. bzoj 1621: [Usaco2008 Open]Roads Around The Farm分岔路口【dfs】

    模拟就行--讲道理这个时间复杂度为啥是对的??? #include<iostream> #include<cstdio> using namespace std; int k, ...

  6. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 -- 状压DP

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MB Description 混乱的奶牛 [Don Pi ...

  7. BZOJ 1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛:dp【网格型】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1616 题意: 有一个n*m的网格. '.'表示平坦的草地,'*'表示挡路的树(不能走). ...

  8. bzoj 1609[Usaco2008 Feb]Eating Together麻烦的聚餐【dp】

    设up[i][j]为第i位升序为j的最小修改数,down为降序 #include<iostream> #include<stdio.h> using namespace std ...

  9. bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛【dp】

    写了个bfs发现MLE了... 设f[t][i][j]为在t时刻走到(i,j)的方案数,转移和bfs一样 #include<iostream> #include<cstdio> ...

随机推荐

  1. AJAX json集合传入Controller后台

    HTML代码 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  2. linux 如何查看进程的执行时间

    ps  -ef|grep wo.php 得到 程序的pid 如 123 ps -p 123 -o etime

  3. day03_12/13/2016_bean属性的设置之setter方法注入

  4. Unity学习-地形的设置(五)

    添加地形游戏对象 [Hierarchy-Create-Terrain] 为了看的看清楚,在添加一个平行光 [Hierarchy-Create-Direction light] 导入地形包 [Asset ...

  5. PHP常用的一些函数:

    背景:这一次是对一些函数进行整理,方便以后的使用. 1.date(); date()函数的作用是获取当前日期时间,由于PHP 5.0对date()函数进行了重写,因此,当前的日期时间函数比系统时间少了 ...

  6. PHP第二阶段学习 一、php的基本语法

    php的基本语法 输出语句:a.  echo输出:可以输出多个字符串,逗号隔开 b.  print输出:只能输出一个字符串,返回true或false c.  print_r():可以把字符串和数字简单 ...

  7. 【译】x86程序员手册13-第5章 内存管理

    Chapter 5 Memory Management 内存管理 The 80386 transforms logical addresses (i.e., addresses as viewed b ...

  8. CNN结构:色彩空间建模-色彩空间分析

    原文: 色彩空间基础 好一个NB的知乎专栏:色彩空间基础 第一章:色彩空间基础 关于色彩分析,引出了专门的数学基础.整个过程给出了完备的数学阐述,虽然没有试验数据,论述的相当精彩. 摘抄出一段:  上 ...

  9. Python 之__slots__的作用

    # 注意:__slots__ 用来限制当前类的实例属性的,如:name.age才可被使用,添加其他的属性则报错 # 不会限制继承类的属性 class Person(): __slots__ = (&q ...

  10. C/C++ 之dll注入

    #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> ...