最后一个点不需要考虑从他之前考虑即可 如果设vs[i][j]是第i个时间的第j个程序需要的时间,那么状态转移方程为 d p [ i ] = m i n ( d p [ i ] , d p [ i + v s [ i ] [ j ] ] + v s [ i ] [ j ] ) dp[i]=min(dp[i],dp[i+vs[i][j]]+vs[i][j]) dp[i]=min(dp[i],dp[i+vs[i][j]]+vs[i][j])
#include<iostream>#include<vector>#include<cstring>usingnamespace std;constint MAXN =2e5+100;
vector<int> vs[MAXN];int dp[MAXN];intmain(){
//freopen("input.txt", "r", stdin);//freopen("out.txt", "w", stdout);int n, k, x, y;
cin >> n >> k;for(int i=0;i<k;i++){
cin >> x >> y;
vs[x].emplace_back(y);}memset(dp,0x3f,sizeof dp);
dp[n]=0;for(int i=n-1;i>0;i--){
int len = vs[i].size();if(len ==0) dp[i]= dp[i +1];else{
for(int j=0;j<len;j++){
int t = dp[i + vs[i][j]]+ vs[i][j];if(t <= n){
dp[i]=min(dp[i], dp[i + vs[i][j]]+ vs[i][j]);}else{
dp[i]=min(dp[i], n);//不能超过n}}}}
cout << dp[1];return0;}