0%

Codeforces Round 1044 (Div. 2)——D. Chicken Jockey(跌落伤害,最少攻击次数)

思路讲解

其实这个dp的思路非常简单,被AI带偏了。

dp[i]dp[i] 表示消除到第 i 个序列所需的攻击次数。

dp[i1]+A[i]1dp[i-1]+A[i]-1 这个表示不做任何操作。

dp[i2]+A[i1]+A[i]min(A[i],i1)dp[i-2]+A[i-1]+A[i]-\min(A[i],i-1) 这个表示做操作,A[i1]A[i-1] 需要消掉,A[i]A[i]可以跌落,跌落伤害是 min(A[i],i1)\min(A[i],i-1)A[i]min(A[i],i1)A[i]-\min(A[i],i-1) 这个就是剩余所需操作数。

1
2
3
4
5
6
7
8
9
10
11
12
13
inline void __(){
cin>>N;
vll A(N+5);
FOR(i,1,N){
cin>>A[i];
}
vll dp(N+5);
dp[1]=A[1];
FOR(i,2,N){
dp[i]=min(dp[i-1]+A[i]-1,dp[i-2]+A[i-1]+A[i]-min(A[i],i-1));
}
cout<<dp[N]<<"\n";
}

AC代码

https://codeforces.com/contest/2133/submission/335405306

心路历程(WA,TLE,MLE……)