P2905 [USACO08OPEN]农场危机Crisis on the Farm
DP
设 f [ i ] [ j ] [ k ] 表示已经走了 i 步,向上走了 j 步,向右走了 k 步时能拯救的最多奶牛数(j,k可以为负,表示反向)
设 g [ i ] [ j ] 表示牛向上走 i 步,向右走 j 步后有多少奶牛恰好在草堆上(同样 i , j 可负)
那么 f [ i ] [ j ] [ k ] = max( f [ i-1 ] [ j -1 ] [ k ] , f [ i-1 ] [ j ] [ k-1 ] , f [ i-1 ] [ j+1 ] [ k ] ,f [ i-1 ] [ j ] [ k+1 ]) +g [ j ] [ k ]
因为数组下标不能为负,所以要把坐标集体加上一个 K
为了方便按字典序输出,我们要倒过来推,并且要按字典序的方向来枚举
即从 f [ k ] 推到 f [ 0 ] 枚举方向为 'E' 'N' 'S' 'W'
好像不太好讲,具体还是看代码吧,代码不难的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=,K=;
int n,m,k;
int xx[]={,,,-},yy[]={,,-,};
char mp[]={'E','N','S','W'};
int f[K<<][N][N],g[K<<][K<<];
int cow[N][],hay[N][];
int main()
{
n=read(); m=read(); k=read();
for(int i=;i<=n;i++) cow[i][]=read(),cow[i][]=read();
for(int i=;i<=m;i++) hay[i][]=read(),hay[i][]=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(abs(hay[j][]-cow[i][])+abs(hay[j][]-cow[i][])<=k)//如果可以到达才计算贡献
g[hay[j][]-cow[i][]+K][hay[j][]-cow[i][]+K]++;//预处理g
for(int i=k;i>=;i--)
for(int x=K-i;x<=K+i;x++)
for(int y=K-i;y<=K+i;y++)//注意大小写K的区别
{
for(int o=;o<;o++) f[i][x][y]=max(f[i][x][y],f[i+][x+xx[o]][y+yy[o]]);
f[i][x][y]+=g[x][y];
}
printf("%d\n",f[][K][K]);
int posx=K,posy=K;//存当前位置
for(int i=;i<k;i++)
{
int o;
for(o=;o<;o++) if(f[i][posx][posy]==f[i+][posx+xx[o]][posy+yy[o]]+g[posx][posy]) break;//如果是从o推过来的就断开
posx+=xx[o]; posy+=yy[o];
printf("%c",mp[o]);
}
return ;
}
P2905 [USACO08OPEN]农场危机Crisis on the Farm的更多相关文章
- bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm 发现总步数$k<=30$,考虑用$k$瞎搞 设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i ...
- 洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm 题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每 ...
- 洛谷 P2905 [USACO08OPEN]农场危机Crisis on the Farm
题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)
惯例,化简题意(看长短决定难度) 一块草坪上有两种点(姑且称为a和b),各有坐标,现在能同时使所有a点向东西南北任意一个方向移动一个单位,若a点与b点重合,则答案增加重合数,求答案的最大值并且求出这个 ...
- bzoj1621 / P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm
P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 基础dfs,按题意递归即可. #include<iostream> #include< ...
- [USACO08OPEN]农场周围的道路Roads Around The Farm BZOJ 1621 DFS
Farmer John's cows have taken an interest in exploring the territory around the farm. Initially, all ...
- BZOJ1605 [Usaco2008 Open]Crisis on the Farm 牧场危机
标题好长&&我是权限狗,汪汪! 题没看懂的我以为这是一道极难滴题目...然后,然后我就看懂题了. 数据少给了一个条件K <= 30...(没这条件还做个鬼...) f[k, i, ...
- BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机:dp【找转移路径】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1605 题意: 平面直角坐标系中,有n个点,m个标记(坐标范围1~1000). 你可以发出口 ...
- BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机 DP
题意:链接 方法: DP 解析: 第一眼搜索题,复杂度不同意dfs,并且牛的数量太多不能bfs,迭代更不可能,A*不会估价.可能记忆化? 等等记忆化我还搜个毛线- 直接改成DP就好了. 状态非常好想非 ...
随机推荐
- Java判断字符串是否包含数字
public static boolean isContainNumber(String company) { Pattern p = Pattern.compile("[0-9]" ...
- cookie禁用后的session
在浏览器地址后加:jsessionid="对应的32位字符串",照样可以访问. 在用户角度来说,浏览器开启,关闭就是一次会话. 在服务器角度来说,session失效才代表一次会话的 ...
- 正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"
#!/usr/bin/env python import re def f1(arg): return 1 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / ...
- LVS+keepalived搭建负载均衡
安装环境:环境 centos4.4 LB:192.168.2.158(VIP:192.168.2.188) real-server1:192.168.2.187 real-server2:192.16 ...
- 04 UUID
1 什么是UUID UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定. 2 应用场景 MySQL数据库不能想oracle数据库那样创建序列,就 ...
- loj10131 暗的连锁
传送门 分析 首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性.我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉 ...
- java8的十大新特性
推荐学习的博客: http://blog.csdn.net/renfufei/article/details/24600507/-------讲解的非常通俗易懂 http://blog.csdn.ne ...
- Joda Time 使用
Joda Time 使用 对于系统的一些时间操作很是不方便,为了方便转化,有时候用date,有时候用timestmp,有时候用calendar,忍不住想更改了. 但是任务巨大,先把笔记收藏了,后面有机 ...
- 【C#】 创建和调用webapi
二,,通过普通的路由调用,,路径写到http://localhost:29920/api/Players 即 Api/controller 为止
- 封闭解(Closed-form solution)、解析解(Analytical solution)、数值解(Numerical solution) 释义
转俞夕的博客 (侵删) 1 解析解 解析解(Analytical solution) 就是根据严格的公式推导,给出任意的自变量就可以求出其因变量,也就是问题的解,然后可以利用这些公式计算相应的问题.所 ...