题目链接
思路摘抄自大佬博客
由于又是至多又是至少没办法处理,所以统一转换成至多,对于事件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>

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

被折叠的 条评论
为什么被折叠?



