1. 程式人生 > 實用技巧 >P1564 膜拜(思維+線性DP)

P1564 膜拜(思維+線性DP)

題目描述

神牛有很多...當然...每個同學都有自己衷心膜拜的神牛.

某學校有兩位神牛,神牛甲和神牛乙。新入學的nn位同學們早已耳聞他們的神話。

所以,已經衷心地膜拜其中一位了。現在,老師要給他們分機房。但是,要麼保證整個機房都是同一位神牛的膜拜者,或者兩個神牛的膜拜者人數差不超過mm。另外,現在nn位同學排成一排,老師只會把連續一段的同學分進一個機房。老師想知道,至少需要多少個機房。

輸入格式

輸入檔案第一行包含兩個整數nn和mm。

22到第(n + 1)(n+1)行,每行一個非11即22的整數,第(i + 1)(i+1)行的整數表示第ii個同學崇拜的物件,11表示甲,22表示乙。

輸出格式

輸出一個整數,表示最小需要機房的數量。

題解:

把所有的2換成-1,問題就轉換成了,使每個機房裡的元素權值的絕對值小於等於m。

簡單線性DP做一下即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=5005;
int dp[maxn];
int a[maxn];
int c[maxn];
int n,m;
int main () {
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",a+i);
    for (int
i=1;i<=n;i++) if (a[i]==2) a[i]-=3; for (int i=1;i<=n;i++) c[i]=c[i-1]+a[i]; for (int i=1;i<=n;i++) dp[i]=1e9; for (int i=1;i<=n;i++) { for (int j=i-1;j>=0;j--) { if (abs(c[i]-c[j])<=m||c[i]-c[j]==i-j||c[i]-c[j]==j-i) { dp[i]=min(dp[i],dp[j]+1
); } } //printf("%d\n",dp[i]); } printf("%d\n",dp[n]); }