题意:链接

方法: 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. Coursera公开课-Machine_learing:编程作业7

    这周的编程作业主要是两方面内容. 1.K-means聚类. 2.PCA(Principle Component Analys)主成分分析. 方式主要是通过对图像的聚类实现压缩图像,后来发现PCA也可以 ...

  2. JS高级——扩展内置对象的方法

    基本概念 内置对象有很多,几个比较重要的:Math.String.Date.Array 基本使用 1.内置对象创建出来的对象使用的方法使用的其实都是内置对象的原型对象中的方法 (1)a并没有charA ...

  3. html5——颜色

    CSS2 1.opacity,可以设置透明度,但是父盒子设置了透明度会影响子盒子 CC3 1.transparent属性,但是不可改变透明值 2.rgba():r--red g--green b--b ...

  4. [ECharts]"echarts/config" is not exists

    今天在给Echarts折线图中的数据点增加点击事件的时候总是出现一个 Uncaught Error: [MODULE_MISS]"echarts/config" is not ex ...

  5. Android中Webview使用经验总结

    很早前就喜欢在Android中使用Webview组件结合JS来做应用,总结了一些不错的小经验,在这里持续更新,自己备忘,也希望给其他需要的同学一些参考- 1.添加权限 要用Webview,确认你在** ...

  6. C# 打开模态对话框 和打开文件夹

    C# 打开另一个窗体,(模态对话框) Form1 frm= new Form1(); //创建对象 DialogResult retServer = frm.ShowDialog(); //模式对话框 ...

  7. ES6 数组去重 方法用了filter或者 indexOf Array.from

  8. u-boot常用命令

    查看ip地址等信息 print tftp相关 设置ip地址 set ipaddr 192.168.1.5 设置tftp所在电脑ip set serverip 192.168.1.8 最后必须输入sav ...

  9. centos7安装个人网盘nextcloud

    本节介绍如何在centos7上建立个人云盘nextcloud服务器 第一:建立用户nextcloud 第二:安装下载工具wget 第三:把nextcloud账号添加到sudoers目录下 第四:切换到 ...

  10. CentOS 7 不能连接网路的解决方法

    ---恢复内容开始--- 刚安装的CentOS7 是不能连接网络的,更不能使用yum 进行应用的安装 (1)通过ip addr或者是 ifconfig获取需要编辑的文件名 (2)vi /etc/sys ...