题意

  • 齐王和田忌各有n匹马,田忌赢得200,输得-200,平局不得钱,请你安排顺序,解出可获得的最大钱数

思路

  • 先将齐王和田忌的马降序排序

  • 贪心:对于齐王的第k匹马,田忌如果能赢就直接选当前第一匹马,如果不能赢就选择最后一匹马

  • 对于平局的情况,选择第一匹和最后一匹都有可能导致错误决策

  • 由于每一次都只有可能拿第一个和最后一个,所以剩下的一定是一个连续的区间,考虑动态规划

  • 对于齐王的第k匹马

  • 其中,k这个维度是没有意义的,从三维视角,固定k以后的每一层是不相交的,且总共会合成一个三角形,可以压缩到二维平面,k与l,r有关,限制方程为 ,化简得

    最终状态转移方程(01滚动)

AC代码

#include<bits/stdc++.h>
using namespace std;

int dp[2][202020];
int q[202020];
int t[202020];
int cost(int a,int b){
    if(t[a]>q[b]) return 200;
    else if(t[a]==q[b])return 0;
    else return -200;
}

bool cmp(int a,int b){return a>b;}
int main(){

    int n;
    cin  >> n ;
    for(int i=1;i<=n;i++) cin >> t[i];
    for(int i=1;i<=n;i++) cin >> q[i];
    sort(t+1,t+1+n,cmp);
    sort(q+1,q+1+n,cmp);
    
    for(int i=1;i<=n;i++){
        dp[i%2][i]=cost(i,n);
    }

    //r-l+1==n-k+1
    for(int l=n-1;l>=1;l--){
        for(int r=l+1;r<=n;r++){
            dp[l%2][r]=max(dp[(l+1)%2][r]+cost(l,n-r+l),dp[l%2][r-1]+cost(r,n-r+l));
        }
    }

    cout << dp[1][n] << endl ;
    return 0;
}