intさわだんのBlack History

刹那的レジェンドになりたい。

POJ(PKU) 3616 Milking Time

N年ぶりにDPの問題を解いたけどなんとかできた。。。

解法:DP
dp[i] = max(dp[i-1],終わる時間がiの中で最も大きいもの);

実際問題から計算量O(N)しかありえないっぽいし解法しぼれたのでよかった。

#include <cstdio>
#include <algorithm>

using namespace std;

typedef pair<int,int> P;
typedef pair<int,P> PP;
int dp[1000003] = {0};
int main(){
  
  int n,m,r;

  
  PP l[1002];
  
  scanf("%d%d%d",&n,&m,&r);
  
  for(int i = 0;i < m;i++){
    scanf("%d%d%d",&l[i].second.first,&l[i].first,&l[i].second.second);
  }
  
  sort(l, l + m);
  
  int nau = 0;

  for(int i = 1;i <= n;i++){
    int m = 0;
    while(1){
      if(l[nau].first == i){
	int sa = l[nau].second.first - r;
	if(sa > 0){
	  m = max(m,dp[sa]+l[nau].second.second);
	}else{
	  m = max(m,l[nau].second.second);
	}
      }else{
	break;
      }
      nau++;
    }
    dp[i] = max(dp[i-1],m);
  }

  printf("%d\n",dp[n]);
  
  return 0;
  
}