看代码能拿几分
查看原帖
看代码能拿几分
1283785
boringGhast楼主2024/10/26 22:00
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int t,n,a[20005],f[20005][20005];

inline int max(int a,int b){
  return a>b?a:b;
}

int main (){
  cin>>t;
  while(t--){
      cin>>n;
      for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
      }
      for(int i=0;i<=n;i++) memset(f[i],0,(n+1)*sizeof(int));
      for(int i=n;i>=0;i--){
        for(int j=n;j>=0;j--){
        int k=max(i,j)+1;
        if(k==n+1) continue;
        f[i][j]=max(f[k][j]+(a[i]==a[k]?a[i]:0),f[i][k]+(a[j]==a[k]?a[j]:0));	
      }
    }
    cout<<f[0][0]<<'\n';
  }
	
  return 0;
}

思路是f[i,j]f[i,j]表示redred序列最后一个为iiblueblue序列最后一个为jj时总体最大值;
转移公式是由dfs代码得到的: dfs(i,j,k)=max(dfs(k,j,k+1),dfs(i,k,k+1))dfs(i ,j ,k)=\max(dfs(k,j,k+1),dfs(i,k,k+1))
推出 f[i,j]=maxk=max(i,j)+1(f[k,j]+a[k]a[k]=a[i],f[i,k]+a[k]a[k]=a[j])f[i,j]=\max_{k=\max(i,j)+1}(f[k,j]+a[k]_{a[k]=a[i]},f[i,k]+a[k]_{a[k]=a[j]}) O(n2)O(n^2)的复杂度前50%50\%的数据不会TLE,能过样例一但不知道正确性咋样
有没有dalao帮我看看会挂多少分

2024/10/26 22:00
加载中...