题目传送门
一道区间 dp 题……
在 dp 之前,我们需要明确以下几个东西:
状态的表示,状态转移方程,边界条件跟答案的表示。
        
           状态的表示
      
定义 sum(l,r)=∑i=lrai
dpl,r 表示目前剩下的数为 al∼ar 时,当前取数的人取数所能获得的最大数字和。
        
           状态转移方程
      
dpl,r=max{sum(l,r)−dpl+1,rsum(l,r)−dpl,r−1
        
           边界条件
      
dpi,i=ai (1≤i≤n)
        
           答案的表示
      
dp1,n−(sum(1,n)−dp1,n)
        
           Code
      
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | #include <bits/stdc++.h>#define int long long
 using namespace std;
 int n, ans, sum[3005], a[3005], dp[3005][3005];
 signed main() {
 ios :: sync_with_stdio(0);
 cin.tie(0);
 cout.tie(0);
 cin >> n;
 for (int i = 1; i <= n; i++) {
 cin >> a[i];
 sum[i] = sum[i - 1] + a[i];
 }
 for (int i = 1; i <= n; i++) dp[i][i] = a[i];
 for (int len = 2; len <= n; len++) {
 for (int l = 1, r = l + len - 1; r <= n; l++, r++) {
 dp[l][r] = max(sum[r] - sum[l - 1] - dp[l + 1][r], sum[r] - sum[l - 1] - dp[l][r - 1]);
 }
 }
 cout << dp[1][n] - (sum[n] - dp[1][n]);
 return 0;
 }
 
 |