题解:P12687 [KOI 2022 Round 1] 鹅卵石
设
显然进行操作 2 如果可以使拿走全部石子,这将会使我们拿石子的步数变少,优化选石子的过程。我们暴力的去寻找一个
则有转移:
如何判断是否可以只通过操作 2 来拿走全部石子呢?我们考虑操作 2 拿走的石子数量与左边或者右边有关,如果我们从最右侧(即
代码见下:
#include<bits/stdc++.h>
using namespace std;
int dp[2505],a[2505],b[2505];//考虑到第i个位置,i前面的所有数都被拿走的最小步数
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
int point=1;
dp[i]=dp[i-1]+1;
for(int j=1;j<=i;j++)b[j]=a[j];
for(int j=i;j>=1;j--){
b[j-1]-=b[j];
if(b[j-1]<0){point=j;break;}
}
for(int j=point;j<=i;j++){
if(b[j]==0)dp[i]=min(dp[i],dp[j-1]+i-j);
}
}
cout<<dp[n];
return 0;
}