hdu6249 區間動態規劃
阿新 • • 發佈:2018-09-16
sha using name scanf 題意 long long tdi ret tar
題目鏈接
題意:給出一些區間,求選k個區間能覆蓋的最多點的數量
思路:定義dp[i][j]為前i個點取j個區間的最大值。dp[i][j]可以轉移到dp[i+1][j+1]和以i+1為起點的區間終點
具體可以看代碼
#include <iostream> #include <cstdio> using namespace std; #define ll long long const int maxn = 2005; int t[maxn],dp[maxn][maxn]; int main() { int T; cin>>T; for(int cn=1;cn<=T;cn++) { int ans=0; int n,m,k; scanf("%d %d %d",&n,&m,&k); for(int i=0;i<=n;i++) { for(int j=0;j<=k;j++)dp[i][j]=0; t[i]=0; } for(int i=1;i<=m;i++) { int x,y; scanf("%d %d",&x,&y); for(int j=x;j<=y;j++) { t[j]=max(t[j],y); } } for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { if(t[i]) dp[t[i]][j]=max(dp[t[i]][j],dp[i-1][j-1]+t[i]-i+1); dp[i][j]=max(dp[i][j],dp[i-1][j]); } } for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) ans=max(ans,dp[i][j]); cout<<"Case #"<<cn<<": "; cout<<ans<<endl; } return 0; }
hdu6249 區間動態規劃