2 条题解
-
0
孙老板的代码 (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
- 上传者