洛谷 p1803(dp做法)
阿新 • • 發佈:2018-12-12
首先dp[i]表示在前幾場比賽時間中可以選幾場 那麼轉移方程就是dp[i]=max(dp[i-1],dp[temp]+1) 前者是不選第i場,後者是選第i場 而dp[temp]表示從dp[i-1]向前找到第一個允許參加的dp
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> using namespace std; struct node{int x;int y;}map[1000005]; int dp[1000005]; bool cmp(node a,node b) {if(a.y==b.y) return a.x<b.x; else return a.y<b.y; } int n; int main() {cin>>n; for(int i=1;i<=n;i++) cin>>map[i].x>>map[i].y; int temp=0; sort(map+1,map+n+1,cmp); dp[0]=0; for(int i=1;i<=n;i++){ while(map[temp+1].y<=map[i].x)temp++; dp[i]=max(dp[i-1],dp[temp]+1); } printf("%d",dp[n]); return 0; }