题意:链接

方法: 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. 写出更好的 JavaScript 条件语句

    1. 使用 Array.includes 来处理多重条件 // 条件语句 function test(fruit) { if (fruit == 'apple' || fruit == 'strawb ...

  2. ASP.NET MVC5 之 AspNetUsers 表增加字段

    MVC5 执行数据库迁移时,会生成一些默认的数据表,但是在实际的工作中.若用到的时候,难免要增添一些字段. 1.AspNetUsers 增加字段 A.打开MVC中的 IdentityModels.cs ...

  3. Linux下安装Wine 运行、卸载 windows程序

    资料 首页 https://www.winehq.org/ 安装 https://www.winehq.org/download/ 教程 https://www.winehq.org/document ...

  4. 在下载jar包时,要有三个包,分别为使用的把class、查看文档的api、查看源代码的资源包

    字节码包: spring-webmvc-4.1.6.RELEASE.jar 文档包:    spring-webmvc-4.1.6.RELEASE-javadoc.jar 资源包:    webmvc ...

  5. 【Leetcode】474. Ones and Zeroes

    Today, Leet weekly contest was hold on time. However, i was late about 15 minutes for checking out o ...

  6. CDH5.7Hadoop集群搭建(离线版)

    用了一周多的时间终于把CDH版Hadoop部署在了测试环境(部分组件未安装成功),本文将就这个部署过程做个总结. 一.Hadoop版本选择. Hadoop大致可分为Apache Hadoop和第三方发 ...

  7. java heap 异常

    近期,项目每运行一周之后就会堆异常, java.lang.OutOfMemoryError: Java heap space,导致应用中断. 解决办法:将堆内存修改大一点. 从性能优化工具中可以看到修 ...

  8. React Native导航器Navigator

    React Native导航器Navigator 使用导航器可以让你在应用的不同场景(页面)间进行切换.导航器通过路由对象来分辨不同的场景.利用renderScene方法,导航栏可以根据指定的路由来渲 ...

  9. Caffe2:添加CUDA路径

    在使用Eclipse时候,仍然出现 libcuda.so 找不到的情况..... 原因:cuda环境没有设置到系统环境中. 方案: 设置CUDA path: 在bashrc中添加路径,只对当前用户产生 ...

  10. javascript常用功能函数

    特殊字符转义:将<, >, &, “进行转义 function escape(str){ return str.replace(/[<>"&]/g,f ...