思路:

令dp[i]表示前i个的最大舒适度。则如果区间[j, i](1 < j <= i)满足条件,有如下转移:dp[i] = max(dp[i], dp[j - 1] + cur)。其中,cur为区间[j, i]的舒适度。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int MAXN = 5005;
 7 int n, a[MAXN], l[MAXN], r[MAXN], vis[MAXN], dp[MAXN];
 8 
 9 int main()
10 {
11     cin >> n;
12     for (int i = 1; i <= n; i++)
13         cin >> a[i];
14     for (int i = 1; i <= n; i++)
15     {
16         if (!l[a[i]]) l[a[i]] = i;
17         r[a[i]] = i;
18     }
19     for (int i = 1; i <= n; i++)
20     {
21         dp[i] = dp[i - 1];
22         int cur = 0;
23         memset(vis, 0, sizeof(vis));
24         int minL = l[a[i]]; 
25         for (int j = i; j >= 1; j--)
26         {
27             if (r[a[j]] > i) break;
28             if (!vis[a[j]]) vis[a[j]] = 1, cur ^= a[j];    
29             minL = min(minL, l[a[j]]);
30             if (minL >= j) dp[i] = max(dp[i], dp[j - 1] + cur);
31         }    
32     }        
33     cout << dp[n] << endl;
34     return 0;    
35 } 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-24
  • 2021-08-25
  • 2022-12-23
  • 2021-12-20
  • 2021-07-31
  • 2022-12-23
猜你喜欢
  • 2021-07-22
  • 2022-12-23
  • 2021-10-24
  • 2022-12-23
  • 2021-12-28
  • 2021-06-12
  • 2021-12-30
相关资源
相似解决方案