AcWing 周賽 C題 4418. 選元素
阿新 • • 發佈:2022-05-08
閆式dp分析法
狀態表示f[i][j]:表示在前i個數中選,且包含第i個數,一共j個數的所有集合,屬性:max
狀態計算:
f[i][j]:當前第j個點已經在第i個位置,那麼第j-1個點與第j個點之間的點數個數應該不大於k,那麼假設倒數第二個點
即第j-1個點的下標是t 則 i-k<=t<i
那麼f[i][j]=max(f[i][j],f[t][j-1]+a[i]) t=>(i-k<=t<i)
最後的結果是在n-k+1 ~ n之間選擇一個最後一個點取最大值即可
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 210; LL a[N],dp[N][N]; int main(){ int n,k,x; cin>>n>>k>>x; for(int i=1;i<=n;i++) cin>>a[i]; memset(dp,-0x3f,sizeof dp); dp[0][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=x;j++) for(int r=max(0,i-k);r<i;r++) dp[i][j]=max(dp[i][j],dp[r][j-1]+a[i]); LL ans=-1; for(int i=n-k+1;i<=n;i++) ans=max(ans,dp[i][x]); cout<<ans; return 0; }