Ideas:
Establecemos dp tridimensional: dp [i] [j] [k] dp [i] [j] [k]d p [ i ] [ j ] [ k ]到 第iiHe trabajadojjhasta ahoraj día, incluidojjTrabajé continuamente en j díaskkLa fuerza física mínima consumida en k días.
Entonces, ¿cómo transferir?
Cuando el iiCuando debes descansar el i día, es decir,s [i] = = 0 s [i] == 0s [ i ]==0
- dp [i] [j] [0] = = dp [i - 1] [j] [k] dp [i] [j] [0] == dp [i-1] [j] [k] d p [ i ] [ j ] [ 0 ]==d p [ i-1 ] [ j ] [ k ](其中1 <= k <= j 1 <= k <= j1<=k<=j);
Este iiCuando hay descanso o no hay descanso durante i días, es decir,s [i] = = 1 s [i] == 1s [ i ]==1
- 休息 :dp [i] [j] [0] = dp [i - 1] [j] [k] dp [i] [j] [0] = dp [i-1] [j] [k]d p [ i ] [ j ] [ 0 ]=d p [ i-1 ] [ j ] [ k ](其中1 <= k <= j 1 <= k <= j1<=k<=j);
- 不 休息 :dp [i] [j] [k] = min (dp [i] [j] [k], dp [i - 1] [j - 1] [k - 1] + k) dp [i] [j] [k] = mínimo (dp [i] [j] [k], dp [i-1] [j-1] [k-1] + k)d p [ i ] [ j ] [ k ]=m i n ( d p [ i ] [ j ] [ k ] ,d p [ i-1 ] [ j-1 ] [ k-1 ]+k ) ;
Debido a la limitación de espacio de esta pregunta, tenemos que comprimir el espacio. Usando la idea de espacio comprimido de 01 mochila, podemos quitar la primera dimensión y dejar jjj se puede recorrer en orden inverso, y la complejidad eso (n ∗ n ∗ n) o (n * n * n)o ( n∗norte∗n )。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500,inf = 1e9+20;
int dp[maxn][maxn];
int main()
{
int n,k;
cin >> n >> k;
string s;
cin >> s;
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)dp[i][j] = inf;
dp[0][0] = 0;
for(int i=1;i<=n;i++)
{
for(int j = i; j > 0; j--)
{
for(int k = 1; k <= j; k++)
{
if(s[i-1] == '0')dp[j][0] = min(dp[j][k],dp[j][0]);
else
{
dp[j][0] = min(dp[j][0],dp[j][k]);
dp[j][k] = min(dp[j][k] , dp[j-1][k-1] + k);
}
}
}
}
for(int i=n;i>0;i--)
for(int j=1;j<=n;j++)
if(dp[i][j] <= k)
{
cout<<i<<'\n';
return 0;
}
puts("0");
return 0;
}