题解
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; }
标签:min,int,Sequence,--,Block,dp From: https://www.cnblogs.com/purple123/p/18227234