1. 程式人生 > 其它 >洛谷P1564 膜拜 題解

洛谷P1564 膜拜 題解

技術標籤:python演算法比特幣區塊鏈亞馬遜

膜拜 - 洛谷

description:

給定一串

n 個僅含有 1,2 數字的串,請將其分割成若干個子串,使得其中滿足只有 1 或者 2 ,或者兩種數字的數量之差不超過 m

solution:

比較基礎的

\text{dp}

首先,字首和統計出

1\sim i 中兩種數字之差。

隨便搞搞就行,不過如果把所有的

2 標記成 -1 的話就可以直接累加下去了。

然後設

f_i 表示前 i 個人至少需要的機房數量。

那麼對於一個

0<j<i ,其能轉移到 i 當且僅當其只存在一種數字或者兩種數字之差不超過 m

code:

#include
<cstdio> #include<algorithm> using namespace std; int abs(int x) { if(x<0)return -x; return x; } int f[100005],a[100005],b[100005],d[10005],c[10005]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]==2) { a[i]
=-1; } } for(int i=1;i<=n;i++) { b[i]=b[i-1]+a[i]; if(a[i]==1) { c[i]=c[i-1]+1; d[i]=d[i-1]; } else { c[i]=c[i-1]; d[i]=d[i-1]+1; } } for(int i=1;i<=n;i++) { f[i]=2147483640; } f[0]=0; f[1]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++)//>=0 { int
tmp=b[i]-b[j-1]; if(abs(tmp)<=m||abs(tmp)==i-j+1) { f[i]=min(f[i],f[j-1]+1); } } //f[i]+=1; } printf("%d\n",f[n]); return 0; }