codeforces 988F
题解:
显然我们发现带两把及以上的伞不优
那么我们就带一把伞或不带
然后就很简单了
dp ( i , j ) 表示到 x = i 处,带了编号为 j 的伞( j = 0则为没带)
然后讨论一下转移就行了
1 #include<bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mp(a,b) make_pair(a,b) 4 #define maxn 2005 5 using namespace std; 6 int a,n,m; 7 int c[maxn]; 8 int dp[maxn][maxn]; 9 vector<pii> has[maxn]; 10 int w[maxn]; 11 int main() 12 { 13 scanf("%d%d%d",&a,&n,&m); 14 for(int i=1;i<=n;++i) 15 { 16 int l,r; 17 scanf("%d%d",&l,&r); 18 c[r]++;c[l]--; 19 } 20 for(int i=a;i>=0;--i)c[i]+=c[i+1]; 21 for(int i=1;i<=m;++i) 22 { 23 int x,y; 24 scanf("%d%d",&x,&y); 25 has[x].push_back(mp(i,y)); 26 w[i]=y; 27 } 28 w[0]=0; 29 memset(dp,127/2,sizeof(dp)); 30 dp[0][0]=0; 31 for(int i=0;i<a;++i) 32 { 33 for(int j=0;j<=m;++j)if(dp[i][j]<(int)1e9) 34 { 35 if(c[i+1]) 36 { 37 if(j)dp[i+1][j]=min(dp[i+1][j],dp[i][j]+w[j]); 38 } 39 else dp[i+1][j]=min(dp[i+1][j],dp[i][j]+w[j]); 40 if(!c[i+1])dp[i+1][0]=min(dp[i+1][0],dp[i][j]+w[0]); 41 for(int k=0;k<has[i].size();++k) 42 { 43 int x=has[i][k].first; 44 dp[i+1][x]=min(dp[i+1][x],dp[i][j]+w[x]); 45 } 46 } 47 } 48 int ans=(int)1e9; 49 for(int j=0;j<=m;++j)ans=min(ans,dp[a][j]); 50 if(ans==(int)1e9)puts("-1"); 51 else printf("%d\n",ans); 52 return 0; 53 }