Loading

题解:P17015 [GESP202606 七级] 消消乐

区间 dp 水题。
定义 \(f_{i,j}\) 表示删除 \(a_i\)\(a_j\) 的所有元素的最大得分,容易得到状态转移方程:

\[f_{i,j}=f_{i,k-1}+f_{k+1,j}+a_{i-1}+a_{j+1} \]

(先删除 \(a_i\)\(a_{k-1}\),再删除 \(a_{k+1}\)\(a_j\),最后删除 \(a_{k}\),此时相邻的两个元素为 \(a_{i-1}\)\(a_{j+1}\)。)
由于涉及取 \(\max\) 操作,所以数组初始化为 \(0\) 即可。

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define piii pair<pii, int>
#define pll pair<ll, ll>
#define plll pair<pll, ll>
#define pref static inline
#define fi first
#define se second
const int MAXN=105;
using namespace std;
ll t,f[MAXN][MAXN],sum,aj[MAXN],temp,n;
namespace heffo_hard{
    pref void solve(){
        cin>>n;
        for(int i=1;i<=n;++i)cin>>aj[i];
        aj[0]=aj[n+1]=0;
        for(int l=1;l<=n;++l){
            for(int i=1;i<=n;++i){
                int j=i+l-1;
                if(j<=n){
                    for(int k=i;k<=j;++k)
                         f[i][j]=max(f[i][j],f[i][k-1]+f[k+1][j]+aj[i-1]+aj[j+1]);
                  }
            }
        }
        cout<<f[1][n];
    }
};

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    heffo_hard::solve();
    return 0;
}
/*
heffo_hard
*/

如果这篇题解对您有帮助,可以点个赞吗?

posted @ 2026-06-30 23:03  heffo_hard  阅读(31)  评论(0)    收藏  举报