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