dp 思路求助

P2135 方块消除

```cpp #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> #include<cassert> #include<vector> #include<set> #include<chrono> #include<cstring> #include<unordered_map> #include<map> #include<bits/stdc++.h> using namespace std; template<typename T> inline bool cmin(T& x,const T& y){return y<x?x=y,1:0;} template<typename T> inline bool cmax(T& x,const T& y){return x<y?x=y,1:0;} typedef long long ll; typedef pair<int,int> pii; typedef vector<int> vi; typedef vector<vector<int> > vii; typedef unsigned int ui; typedef unsigned long long ull; #define X first #define Y second const int MAXN=50+10; int a[MAXN],b[MAXN]; int F[MAXN][MAXN]; int main() { // freopen("1.txt","r",stdin); // freopen("1.out","w",stdout); // cerr<<(double)13/24<<' '<<(double)8/15<<'\n'; ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)cin>>b[i]; int tot=0; tot=1; for(int i=2;i<=n;i++) { if(a[i]==a[i-1]) { b[tot]+=b[i]; } else a[++tot]=a[i],b[tot]=b[i]; } n=tot; for(int len=1;len<=n;len++) { for(int l=1;l+len-1<=n;l++) { int r=l+len-1; if(l==r) { F[l][r]=b[l]*b[l]; continue; } if(a[l]==a[r]) { int sum=b[l],ans=0; int la=l; for(int k=l+1;k<=r;k++) { if(a[l]==a[k]) { ans+=F[la+1][k-1]; sum+=b[k]; la=k; } } cmax(F[l][r],ans+sum*sum); } for(int k=l;k<r;k++)cmax(F[l][r],F[l][k]+F[k+1][r]); } } cout<<F[1][n]; return 0; } ```
by __stick @ 2022-11-16 17:01:04


@[__stick](/user/571229) 你这个数据之所以会输出43,是因为你有相邻的块颜色相同,这个题目是不是应该保证给的相邻块颜色不同啊,反正那个把数据改成 ``` 3 1 3 2 4 5 7 ``` 就跑的没有问题,你要说硬改的话,再加个合并相邻相同的就好了
by LgxTpre @ 2023-03-26 14:25:38


|