题目入口 洛谷
!!!dp数组开大了 初始化为1e9,然后一直报错,案例都过不了,对题解也没错,前后浪费好几小时。
由于桥的长度为 L(1 <= L <= 1e9),所以需要对坐标进行离散化,离散后最坏的长度 2000,这时候可以进行 一维动态规划。
状态转移方程:
dp[ i ] = min( dp[i - j] + v[ i ], dp[ i ] ) i >= j
注意:
当事人很后悔没注意看题,所以终点是一个范围不是一个点
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int l, s, t, m;
int dp[2*maxn], v[2*maxn], f[maxn];
int main(){
cin >> l;
cin >> s >> t >> m;
memset(dp , 105,sizeof(dp));
memset(v, 0, sizeof(v));
for(int i = 1; i <= m; i++){
cin >> f[i];
}
f[0] = 0, f[m + 1] = l;
sort(f, f + m + 2);
// 坐标离散化
int cnt = 0;
for(int i = 1; i <= m + 1; i++){
if(f[i] - f[i - 1] >= t)
cnt += (f[i] - f[i - 1]) % t + t;
else
cnt += f[i] -f[i - 1];
v[cnt] = 1;
}
v[cnt] = 0, v[0] = 0;
// 动态规划
dp[0] = 0;
for(int i = 1; i <= cnt + t - 1; i++){
for(int j = s; j <= t; j++){
if( i >= j)
dp[i] = min(dp[i - j] + v[i], dp[i]);
}
}
// 找出最小值
int ans = 2e9;
for(int i = cnt; i <= cnt + t - 1; i++)
ans = min(ans, dp[i]);
cout << ans << endl;
return 0;
}