题意:链接

方法: 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. An problem about date 根据年月日计算 星期几

    /W = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7(1.2月需要看作上一年的13.14月) #include<stdio.h> #include& ...

  2. Zookeeper概念学习系列之zookeeper的节点

    znode有两种类型:  临时节点(ephemeral  node) 和 持久节点(persistent node). znode的类型在创建时确定并且之后不能再修改. 短暂znode的客户端会话结束 ...

  3. Intent的调用

    //Intent  intent=new Intent();//intent.setClass(MainActivity.this, GPSService.class);//以上二条可以合并成如下一条 ...

  4. OpenCV绘制检测结果

    OpenCV绘制检测结果 opencv  rtcp  timestamp  一.介绍 由于在验证阶段,使用FPGA时我们的算法检测速度很慢,没法直接在主流上进行绘图,否则的话,主流就要等待算法很久才能 ...

  5. 删除过期备份报错RMAN-06207 RMAN-06208解决方案

    RMAN备份日志中出现了警告 日志文件目录如下: [root@erpdbs rmanback]# ll total 88 -rw-r--r-- 1 oraprod dba 81011 Sep 7 22 ...

  6. jQuery——链式编程与隐式迭代

    链式编程 1.原理:return this; 2.通常情况下,只有设置操作才能把链式编程延续下去.因为获取操作的时候,会返回获取到的相应的值,无法返回 this. 3.end():结束当前链最近的一次 ...

  7. [Windows Server 2008] Ecshop安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:ECSHO ...

  8. iframe监听unload事件

    阻止默认事件 event.preventDefault(); 阻止事件冒泡 event.stopPropagation(); event.cancelBubble = true; //IE <a ...

  9. 3星|《IBM商业价值报告:区块链》:一些重要行业对区块链的态度和已经发生的区块链的应用

    区块链项目开发指南 (区块链技术丛书) 介绍IBM的专家们调研许多重要行业与组织后总结的各行业对区块链的态度和实际的应用.看起来有点意思,不过有两个缺点: 1:这些实际已经发生的应用基本没看到相关的新 ...

  10. 【sqli-labs】 less45 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)

    和Less44一个名字 测试一下,发现是')闭合的 login_user=&login_password=1') or sleep(0.1)# 那就是没有错误显示的less42 login_u ...