【bzoj1499】瑰丽华尔兹
这名字听起来实在有点耳熟。。?
好吧去年暑假就应该过的题。。。切了
先注意到,天使施魔法的次数不限;我们可以使得某个时刻在特定方向移动一段距离(最长的长度为那个时间段)然后怎么来考虑这个DP;
T,X,Y三维状态很好想到,刚开始的时刻是1,T-1的方向已知,要么从那个方向移动到X,Y,要么在此位置不动。现在来优化这个DP。我们的动机是把O(N*M*T)->O(N*M*K),至于为什么要这要做。。。(题感啊题感,所有的优化都是优化转移嘛不可能优化状态了,所以当转移都无法优化的时候我们只能考虑来改变这个状态。K是时间段的个数,可以想到,其实在同一时间段里面,操作几乎都是相同的。那么dp[K][X][Y]表示在K这段时间内,位于(X,Y)这个位置,从时段1到时段K的最大位移。那么转移就成为了:dp[K][X][Y]=MAX{dp[K-1][X'][Y']+DIST}
*举个例子,假如当前时间段朝向是往右,那么dp[k][x][y]=max{dp[k-1][x][y-Δy]+Δy}=y+max{dp[k-1][x][y']-y'},Δy自然要小于等于当前时间段的长度。现在转移就可以被优化了,我们把k-1时间段的状态记载下来,保证单调递减就OK了,其它三个方向也是类似的:
left:dp[k][x][y]=max{dp[k-1][x][y']+y'}-y
up:dp[k][x][y]=max(dp[k-1][x'][y]+x'}-x
down:dp[k][x][y]=max(dp[k-1][x'][y]-x'}+x
在执行队列的过程中我们有几个需要维护的地方,如果当前自己是家具,那么没关系,我们清空队列;
如果要放进的那个是不合法的,那就不放。
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 300
using namespace std;
int n,m,x0,y0,k,ans;
][][];
];
int main()
{
];
scanf("%d%d%d%d%d",&n,&m,&x0,&y0,&k);
;i<=n;i++)
{
scanf("%s",s);
;j<=m;j++)
]==;
}
;i<=k;i++)scanf("%d%d%d",&st[i],&ed[i],&ff[i]);
memset(dp,-,sizeof(dp));
dp[][x0][y0]=;
;i<=k;i++)
{
);
){//向右
;xx<=n;xx++)
{
,tail=;q[].x=dp[i-][xx][]-;q[].h=;
][xx][]==-)tail--;
;yy<=m;yy++)
{
while(tou<=tail&&(yy-q[tou].h>len))tou++;
)if(tou<=tail)dp[i][xx][yy]=q[tou].x+yy;
//if(dp[i][xx][yy]>-1)printf("you===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
){tail=tou-;}
][xx][yy+]==-)continue;
][xx][yy+]-yy->q[tail].x)tail--;
tail++;q[tail].x=dp[i-][xx][yy+]-yy-;q[tail].h=yy+;
}
}
}
)//left
{
;xx<=n;xx++)
{
,tail=;q[].x=dp[i-][xx][m]+m;q[].h=m;
][xx][m]==-)tail--;
;yy--)
{
while(tou<=tail&&q[tou].h-yy>len)tou++;
)if(tou<=tail)dp[i][xx][yy]=q[tou].x-yy;
//if(dp[i][xx][yy]>-1)printf("zuo===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
)tail=tou-;
][xx][yy-]==-)continue;
][xx][yy-]+yy->q[tail].x)tail--;
tail++;q[tail].x=dp[i-][xx][yy-]+yy-;q[tail].h=yy-;
}
}
}
)//向上
{
;yy<=m;yy++)
{
,tail=;q[].x=dp[i-][n][yy]+n;q[].h=n;
][n][yy]==-)tail--;
;xx--)
{
while(tou<=tail&&q[tou].h-xx>len)tou++;
)if(tou<=tail)dp[i][xx][yy]=q[tou].x-xx;
//if(dp[i][xx][yy]>-1)printf("up===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
)tail=tou-;
][xx-][yy]==-)continue;
][xx-][yy]+xx->q[tail].x)tail--;
tail++;q[tail].x=dp[i-][xx-][yy]+xx-;q[tail].h=xx-;
}
}
}
)//xia
{
;yy<=m;yy++)//down
{
,tail=;q[].x=dp[i-][][yy]-;q[].h=;
][][yy]==-)tail--;
;xx<=n;xx++)
{
while(tou<=tail&&xx-q[tou].h>len)tou++;
)if(tou<=tail)dp[i][xx][yy]=q[tou].x+xx;
//if(dp[i][xx][yy]>-1)printf("xia===%d %d %d %d %d\n",i,xx,yy,dp[i][xx][yy],q[tou].h);
)tail=tou-;
][xx+][yy]==-)continue;
][xx+][yy]-xx->q[tail].x)tail--;
tail++;q[tail].x=dp[i-][xx+][yy]-xx-;q[tail].h=xx+;
}
}
}
}
;i<=n;i++)
;j<=m;j++)
if(dp[k][i][j]>ans)ans=dp[k][i][j];
//printf("%d %d %d\n",i,j,dp[k][i][j]);
printf("%d",ans);
}
【bzoj1499】瑰丽华尔兹的更多相关文章
- 洛谷2254 BZOJ1499 瑰丽华尔兹题解
洛谷链接 BZ链接 一个很容易想到的做法就是用f[i][j][t]表示t时刻在i,j处的可以滑动的最大值 f[i][j][t]=max(f[i][j][t-1],f[*i][*j][t-1]),这样大 ...
- 【BZOJ1499】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1714 Solved: 1042[Submit][Status ...
- DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Descripti ...
- NOI2005瑰丽华尔兹
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- luogu P2254 [NOI2005]瑰丽华尔兹
题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...
随机推荐
- 【CityHunter】通过Unity3D来制作游戏中AR部分的内容
嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果 ...
- Dom4j把xml转换成Map(非固定格式)
将xml转换成Map,能够应对不用结构的xml,而不是只针对固定格式的xml.转换规则:1.主要是Map与List的互相嵌套2.同名称的节点会被装进List 示例: import java.util. ...
- php无刷新上传图片和文件
核心思想:通过Html的iframe标签属性操作顶级窗口,再用php动态无刷新上传图片文件. 示例如下: demo |------uploads #存放上传的文件 |------index.php | ...
- Gravatar注册
今天在学习falsk时需要用到头像扩展,需要使用gravatar到网上查了查好像没有被墙,就试着用qq邮箱注册了一个账号,结果等了好长时间也没有等到激活邮箱,就百度了一下发现了一个技巧,原来这封邮件被 ...
- live555库中的testH264VideoStreamer实例
1.h264文件的推送 testH264VideoStreamer.cpp文件的开头就定义了 char const* inputFileName = "test.264"; 后面接 ...
- URL Schemes
APP 被唤醒离不开对URL Schemes的认知. 苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了 URL Schemes 这个解决办法. URL Schemes ...
- 查看修改Linux时区和时间
查看/修改Linux时区和时间 一.时区 1. 查看当前时区 date -R 2. 修改设置时区 方法(1) tzselect 方法(2) 仅限于RedHat Linux 和 CentOS timec ...
- UITableView的添加、删除、移动操作
#pragma mark -----表视图的移动操作----- //移动的第一步也是需要将表视图的编辑状态打开 //2.指定哪些行可以进行移动 - (BOOL)tableView:(UITableVi ...
- 【总结】/etc/rc.d/rc.local 与 /etc/profile .bash_profile .bashrc 文件执行顺序
登陆shell与交互式非登陆shell的区别 登录shell 所谓登录shell,指的是当用户登录系统时所取的那个 shell.登录shell属于交互式shell. 登录shell将查找4个不同的启动 ...
- Linux文件查找命令 find 详解
关于find命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权 ...