dp[i][j][k]=시간 i를 보고 있고, 부를 수 있는 친구 수가 j 명이고 k 명이 이미 파티장에 들어와있을 때로 두고, O(NK2)에 문제를 해결할 수 있다.
intdp[302][301][301];voidsolve(){memset(dp,-1,sizeofdp);intN,M,K,T;cin>>N>>M>>K>>T;vipeople(N+5);for(inti=0;i<M;i++){inta,b;cin>>a>>b;people[a]++;people[b]--;}for(inti=1;i<=N;i++)people[i]+=people[i-1];intans=0;dp[1][K][0]=0;// i 시간을 보고 있고 for(inti=1;i<=N;i++){// 남은 들어오게 할 수 있는 친구 수가 j이고 for(intj=K;j>=0;j--){// 이미 들어와있는 친구 수가 k일 때 for(intk=0;k<=K;k++){if(dp[i][j][k]==-1)continue;if(people[i]>=T){dp[i+1][j][0]=max(dp[i+1][j][0],dp[i][j][k]+1);ans=max(ans,dp[i+1][j][0]);}else{dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]);ans=max(ans,dp[i+1][j][k]);intneed=max(0,T-people[i]-k);if(j>=need){// 더 들어오게 할 친구가 충분할 때 dp[i+1][j-need][k+need]=max(dp[i+1][j-need][k+need],dp[i][j][k]+1);ans=max(ans,dp[i+1][j-need][k+need]);dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]);}}}}}cout<<ans;}
Comments