P1564 膜拜 线性dp min型
题意:
软件22-3班有两位大佬,宋佬和谷神,每个acmer都发自内心的膜拜其中一位,现在acmer 要去训练了,训练机房内需要保证整个机房都是一位大佬的追随者,或者两位大佬追随者人数差不超过m,否则他们会互殴,现在n个acmer排成一排,yao比较笨,只会将连续一段的同学分入一个机房,那么最少需要多少个机房呢
分析:
在输入的时候把2改成-1,这样1代表追随宋佬,2代表追随谷神,同时处理前缀和数组,f[ I ]存的是前i个人最少需要用多少个机房,那么如果前缀和sum[ I ]-sum[ j ]符合分房间的条件(绝对值小于M,或者i到j都相同),f[ I ]=min( f[ I ] ,f[ j ]+1)
代码:
//dp[i]表示前i个人所需的最少机房数。
//前缀和+差分思想。
//if(abs(sum[i]-sum[j-1]==i-j+1)),说明i到j都相同
//if(abs(sum[i]-sum[j-1]<=m)),i和j之间的不同人数差不超过m
//在符合以上两个条件下,转移方程:dp[i]=min(dp[i],dp[j-1]+1)
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(abs(sum[i]-sum[j-1])==i-j+1||abs(sum[i]-sum[j-1])<=m)
{
dp[i]=min(dp[i],dp[j-1]+1);}}}