E. Block Sequence

题解

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;
} 

 

posted @ 2024-06-02 16:11  黑屿白  阅读(31)  评论(0)    收藏  举报