P1564 膜拜(思維+線性DP)
阿新 • • 發佈:2020-08-09
題目描述
神牛有很多...當然...每個同學都有自己衷心膜拜的神牛.
某學校有兩位神牛,神牛甲和神牛乙。新入學的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 (inti=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]); }