1 solutions

  • 0
    @ 2024-12-5 18:19:40

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    ll n;
    ll sco[1005]; // 得分数组 
    ll loss[1005]; // 失分数组(前缀和) 
    ll arr[1005]; // 对手 n 轮出牌 
    ll dp[1005][3][1005]; // dp[i][j][k]: 第 i 场,出 j,换牌 k 次的最大分数 
    
    int main() {
    	cin >> n;
    	for (int i = 1; i <= n; i ++) cin >> sco[i]; // 得分数组
    	for (int i = 1; i < n; i ++) { // 换牌至多只有 n-1 次
    		cin >> loss[i];
    		loss[i] += loss[i - 1]; // 预处理前缀和
    	}
    	for (int i = 1; i <= n; i ++) cin >> arr[i]; // 输入对手的出牌方案
    	
    	for (int i = 1; i <= n; i ++) { // 状态转移
    		for (int k = 0; k < i; k ++) { // 注意 k 只需要枚举到 i-1
    			if (arr[i] == 0) {
    				dp[i][0][k] = max(dp[i - 1][0][k], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k - 1]))+ sco[i];
    				
    				dp[i][1][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k], 
    				dp[i - 1][2][k - 1])) + 2 * sco[i];
    				
    				dp[i][2][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k]));
    			} else if (arr[i] == 1) {
    				dp[i][0][k] = max(dp[i - 1][0][k], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k - 1]));
    				
    				dp[i][1][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k], 
    				dp[i - 1][2][k - 1])) + sco[i];
    				
    				dp[i][2][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k])) + 2 * sco[i];
    			} else if (arr[i] == 2) {
    				dp[i][0][k] = max(dp[i - 1][0][k], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k - 1])) + 2 * sco[i];
    				
    				dp[i][1][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k], 
    				dp[i - 1][2][k - 1]));
    				
    				dp[i][2][k] = max(dp[i - 1][0][k - 1], 
    				max(dp[i - 1][1][k - 1], 
    				dp[i - 1][2][k])) + sco[i];
    			}
    		}
    	}
    	
    	// 统计答案
    	ll ans = 0;
    	for (int k = 0; k < n; k ++) {
    		for (int j = 0; j < 3; j ++) {
    			ans = max(ans, dp[n][j][k] - loss[k]);
    		}
    	}
    	cout << ans << endl;
    	return 0;
    }
    
    • 1

    Information

    ID
    9175
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By