E. Block Sequence

黑屿白發表於2024-06-02

題解

dp陣列的含義:

dp[i]表示從i-n要刪除幾個數使得【i,n】的陣列是優美的。

此時分兩種情況:

1、刪除當前位置的數,則dp[i]=dp[i+1]+1

2、不刪除當前位置的數,則dp[i]=dp[i+a[i]+1]

因此轉移方程為:dp[i]=min(dp[i+1]+1,dp[i+1+a[i]])

code

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],dp[N];
int main(){
//    freopen("input.txt","r",stdin);
    int t;
    cin>>t;
    while (t--){
        int n;
        cin>>n;
        for (int i=1;i<=n;i++){
            cin>>a[i];
            dp[i]=0;
        }
        dp[n]=1;
        dp[n+1]=0;
        for (int i=n-1;i>=1;i--){
            if (i+a[i]>n) dp[i]=dp[i+1]+1;
            else dp[i]=min(dp[i+a[i]+1],dp[i+1]+1);
        }
        cout<<dp[1]<<endl;
    }
    return 0;
}