bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm
发现总步数$k<=30$,考虑用$k$瞎搞
设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i$步,向上走$j$步的最优解
预处理$g[i][j]$表示全体奶牛向右走$i$步,向上走$j$步可以救几只奶牛
显然$f[u][i][j]=max(f[u+1][i+1][j],f[u+1][i-1][j],f[u+1][i][j+1],f[u+1][i][j-1])+g[i][j]$
把方向按字典序,逆推。
end.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cctype> 5 #define re register 6 using namespace std; 7 void read(int &x){ 8 char c=getchar();x=0; 9 while(!isdigit(c)) c=getchar(); 10 while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar(); 11 } 12 int max(int a,int b){return a>b?a:b;} 13 int abs(int a){return a<0?-a:a;} 14 #define K 31 15 #define N 1001 16 const int d1[4]={-1,0,0,1}; 17 const int d2[4]={0,-1,1,0};//方向倒着来因为后面用的是逆推 18 const char d3[4]={'E','N','S','W'}; 19 struct node{int x,y;}a[N],b[N]; 20 int n,m,k,g[K<<1][K<<1],f[K+1][K<<1][K<<1];//坐标为负的话加上一个maxk转正 21 int main(){ 22 read(n);read(m);read(k); 23 for(re int i=1;i<=n;++i) read(a[i].x),read(a[i].y); 24 for(re int i=1;i<=m;++i) read(b[i].x),read(b[i].y); 25 for(re int i=1;i<=n;++i)//预处理g数组 26 for(re int j=1;j<=m;++j) 27 if(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y)<=k) 28 ++g[a[i].x-b[j].x+K][a[i].y-b[j].y+K]; 29 for(re int u=k;u>=0;--u)//逆推好写 30 for(re int i=K-u;i<=K+u;++i) 31 for(re int j=K-u;j<=K+u;++j){ 32 for(int z=0;z<4;++z) 33 f[u][i][j]=max(f[u][i][j],f[u+1][i+d1[z]][j+d2[z]]); 34 f[u][i][j]+=g[i][j]; 35 } 36 printf("%d\n",f[0][K][K]); 37 int x0=K,y0=K; 38 for(re int u=0,z;u<k;++u){ 39 for(z=0;z<4;++z) 40 if(f[u][x0][y0]==f[u+1][x0+d1[z]][y0+d2[z]]+g[x0][y0]) 41 break;//发现是这个状态转移来的就跳出 42 printf("%c",d3[z]); 43 x0+=d1[z]; y0+=d2[z]; 44 }return 0; 45 }
View Code
转载于:https://www.cnblogs.com/kafuuchino/p/9856630.html
bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm相关推荐
- 洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm
P2905 [USACO08OPEN]农场危机Crisis on the Farm 题目描述 约翰和他的奶牛组建了一只乐队"后街奶牛",现在他们正在牧场里排练.奶牛们分成一堆 一堆 ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)
惯例,化简题意(看长短决定难度) 一块草坪上有两种点(姑且称为a和b),各有坐标,现在能同时使所有a点向东西南北任意一个方向移动一个单位,若a点与b点重合,则答案增加重合数,求答案的最大值并且求出这个 ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm
传送门 DP 设 f [ i ] [ j ] [ k ] 表示已经走了 i 步,向上走了 j 步,向右走了 k 步时能拯救的最多奶牛数(j,k可以为负,表示反向) 设 g [ i ] [ j ] 表示 ...
- P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
dp,阶段就是步数. 本蒟蒻想不出来,只好用题解大法:四个方向的走路,dp的阶段是步数,每个点可以由四个方向转移而来.这是逆序做的.他这样做的好吃是最后回到原点,然后逆序找字典序最小即可. 独立思考下 ...
- bzoj 1605: [Usaco2008 Open]Crisis on the Farm 牧场危机(DP)
1605: [Usaco2008 Open]Crisis on the Farm 牧场危机 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 403 S ...
- [Usaco2008 Open]Crisis on the Farm 牧场危机
1605: [Usaco2008 Open]Crisis on the Farm 牧场危机 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 288 S ...
- bzoj1605 洛谷2905 [Usaco2008 Open]Crisis on the Farm 牧场危机(DP)
很暴力的一个题 这个题目大概分为以下几步 一.计算从原点走多少步产生的贡献 曼哈顿距离搞一搞 二.进行DP求最大值 按照字典序贪心的按WSNE进行DP,取最后一个 三.检查合格的终止点 便利一遍DP数 ...
- 2017-2018年度刷题记录
2018暑假刷题1: T1.CF6A Triangle (#模拟 -1.4) T2.CF59A Word(#模拟 -1.5) T3.[洛谷]P2772 寻找平面上的极大点(#贪心 -1.4) T4.[ ...
- 考研英语 长难句训练day68
例1: [These crises], industry insiders say, spring from a culture [that consistently put short-term r ...
最新文章
- c++ 哈希_详解Python中的可哈希对象与不可哈希对象(二)
- Java基础语法初学者了解
- 自考计算机毕业论文答辩视频,过来人谈自考毕业论文答辩有感
- java 删除list_Java 删除List元素的正确方式
- 列转行 oracle11g,PostgreSQL 实现列转行问题
- Spark 计算人员三度关系
- xcode ios 模拟器下载安装
- excel教程自学网_Office 全套办公软件自学视频教程word+excel+ppt
- 重新连接共享打印机报错0x00000002
- basICColor catch 5 Mac(光谱分析颜色测量软件) v5.0.7破解版
- 关于:使用 OCT 自定义部署 Office 2007-2016
- 超级表格pk王者农药,今天你五杀了么?
- 山东大学软件工程应用与实践——RIME输入法配置文件分析
- QA——性能优化(一)
- 如何让Arduino IDE支持你手里的STM32 nucleo开发板
- PHP在线发邮件 无需服务端软件
- 认知BLE中多个MAC地址类型:Public Device Address、Random Device Address、Non-resolvable Private Address
- 三生三世十里桃花手游怎么用电脑玩 三生三世十里桃花模拟器教程
- m3u8.sqlite文件转视频工具
- 用vs编写html后sel,选择后插入HTML
热门文章
- MacBook更新系统空间不足/无限重启/无法退出更新程序
- 以太智云赋能游戏产业,打造长沙顶尖NFT游戏开发平台,实现边玩边赚
- MIT的计算机系课程设置
- android模拟按键方法,Android随笔之——模拟按键操作的几种方式
- 英语--定语从句疑难解答
- openEuler基础(二十)用户创建、密码管理、用户锁定
- W806 基于Arduino开发的GPIO操作示例,勇于尝新
- nplayer,es文件浏览器等进行局域网连接时登录不上或者不断弹出登录框的问题
- python射击小游戏源码_导弹发射小游戏——Python源代码
- Python之任意阶幻方的构造