1. 程式人生 > 其它 >AcWing 周賽 C題 4418. 選元素

AcWing 周賽 C題 4418. 選元素

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