-
题意:
一个工作时间n和任务个数k,每个任务有开始时间和持续时间,问你他的最大间隙时间和,像这种当前的答案对后面的情况有影响的一般就是DP,而类似的贪心就不同,它不会对后续的某种情况有影响,它只对全局最优,好了,这里开始分析! -
思路
我一开始想的用二维dp[i][j]来表示i~j的最大时间,后面发现一是数据大,重要的是麻烦,后面想用dp[i]表示 (1-i) 的闲暇时间,但是从头开始递推,当时的 i 会改变(i-持续时间的)的闲暇时间,所以最后,我就换了从后开始递推,dp[i]表示i-n的闲暇时间,这样就不会对前面造成影响。 -
如何码
分两种情况 :
无任务------dp[i]=dp[i+1]+1,表示(i~n)的闲暇时间+1;
有任务------dp[i]=max(dp[i+v[i][j]],dp[i]),就是表示去找到i+持续时间v[i]时最大的闲暇时间;
#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
int n, k, s, t;
//dp[i] i~n的空闲时间
int dp[10005];
vector<int>v[10005];
int main() {
cin >> n >> k;
while (k--) {
cin >> s >> t;
v[s].push_back(t);
}
for (int i = n; i; --i) {
if (v[i].size() > 0) {
for (int j = 0; j < v[i].size(); ++j)
dp[i] = max(dp[i], dp[i + v[i][j]]);
}
else
dp[i] = dp[i + 1] + 1;
}
cout << dp[1];
}
大一小小萌新,欢迎一起交流~~