【题解】zoj3747 线性DP

该博客介绍了ZOJ3747题目的线性DP解决方案。作者将原问题转化为至多的情况,定义二维数组dp[i][3]来表示不同状态。dp[i][0]、dp[i][1]、dp[i][2]分别对应当前位置放置G、R、P士兵的状态。通过计算最大连续G和R士兵的数量,动态规划更新dp数组,解决至少m个连续士兵的问题。

题目链接
思路摘抄自大佬博客
由于又是至多又是至少没办法处理,所以统一转换成至多,对于事件A={至多N个G士兵连续},事件B={至多m-1个G士兵连续},那么A-B={连续人数在m到n中取值,即至少m个连续士兵}。统一之后,设定一个二维数组,dp[i][3],dp[i][0]表示对于第i个位置,放G士兵,同理,dp[i][1],dp[i][2]分别表示第i个位置放R,和P。
最大连续u个G,连续v个R;
对于当前第i个位置,sum=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
由于放P对整个没有影响,所以,dp[i][2]=sum;
对于A事件
当i <= u 时,dp[i][0]=sum; //至多连续u个,那么小于等于u,就可以直接放G
当i==u+1时,dp[i][0]=sum-1; // 对于现在这个位置,之前可能出现连续u个的情况,当前要放G,就要减去那一种情况
当i>u+1时,dp[i][0]=sum-dp[i-u-1][1]-dp[i-u-1][2]; //此时要减去i前面已经出现连续u个G的情况,即从i-u到i-1这一段都是G,那么i-1-u的位置可以是P或者R, //于是减去dp[i-u-1][1],dp[i-1-u][2]合起来总共具有的情况数。 //对于B事件同理
当i<=v时,dp[i][1]=sum;
当i==v+1时,dp[i][1]=sum-1;
当i>v+1时,dp[i][2]=sum-dp[i-v-1][0]-dp[i-v-1][2];

#include<cstdio>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值