题解: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
*/
如果这篇题解对您有帮助,可以点个赞吗?

浙公网安备 33010602011771号