1 条题解

  • 1
    @ 2022-9-2 22:11:21
    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int inf = 0x3f3f3f3f;
    const int N = 2005; 
    
    int T, n;
    int a[N], dp[N][N];
    
    int main() {
    	cin >> T;
    	while(T--) {
    		scanf("%d", &n);
    		for(int i = 1; i <= n; i++) scanf("%d", a + i);
    		memset(dp, 0x3f, sizeof dp);
    		dp[1][1] = -inf;
    		for(int i = 1; i < n; i++) {//由于我的转移是转移i+1,所以i<n。
    			for(int j = 1; j <= min(n / 2, i); j++) {//剪去无用状态
    				if(a[i] < a[i + 1]) dp[i + 1][j + 1] = min(dp[i][j], dp[i + 1][j + 1]);
    				if(a[i + 1] > dp[i][j]) dp[i + 1][i - j + 1] = min(a[i], dp[i + 1][i - j + 1]);//转移
    			}
    		}
    		if(dp[n][n / 2] == inf) puts("No!");
    		else puts("Yes!");
    	}	
    	return 0;
    }
    
    • 1

    信息

    ID
    1489
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    8
    已通过
    6
    上传者