2 条题解

  • 0
    @ 2022-10-23 21:21:46

    孙老板的代码 (dp),能看懂就看看吧 ,没准以后可能大概也许或许会来注释

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1005;
    int a[maxn], b[maxn], dp[maxn][maxn][2];
    int main(){
    	//freopen("pass.in","r",stdin);
    	//freopen("pass.out","w",stdout);
    	int n, m, k, q;
    	cin >> n >> m >> k >> q;
    	for(int i = 1; i <= n; i++){
    		cin >> a[i];
    	}
    	for(int i = 1; i <= n; i++){
    		cin >> b[i];
    	}
    	a[n+1] = a[n];
    	b[n+1] = b[n];
    	memset(dp, 0x3f, sizeof dp);
    	dp[0][0][0] = 0;
    	dp[0][0][1] = 1;
    	for(int step = 0; step <= 2 * n; step++){
    		for(int j = 0; j <= min(n, step); j++){
    			int i = step - j;
    			if(i > n)	continue;
    			for(int k = 0, r = 0; r <= 3; k++, r++){ // 枚举第三维时,在原地转移 4 次,这样 0 1 都被互相求 min
    				k = r % 2;
    				if(dp[i][j][k] >= 1e9)	continue;
    				if(abs(a[i] - b[j]) <= q)
    					dp[i][j][k^1] = min(dp[i][j][k^1], dp[i][j][k] + 1);
    				if(k == 0){
    					dp[i+1][j][k] = min(dp[i+1][j][k], dp[i][j][k]);
    					if(b[j+1] - b[j] <= m){
    						dp[i][j+1][k] = min(dp[i][j+1][k], dp[i][j][k]);
    					}
    				}else{
    					dp[i][j+1][k] = min(dp[i][j+1][k], dp[i][j][k]);
    					if(a[i+1] - a[i] <= m){
    						dp[i+1][j][k] = min(dp[i+1][j][k], dp[i][j][k]);
    					}
    				}
    			}
    		}
    		
    	}
    	cout << min(dp[n][n][0], dp[n][n][1])<< endl;
    	return 0;
    }
    

    信息

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