Codeforces 988F Rain and Umbrellas 【dp】

等会写题解,先把代码发上来

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #define INF 2100000000
 6 using namespace std;
 7 
 8 int rain[2005],id[2005];//id[i]代表编号为i的雨伞的重量
 9 vector<int> umb[2005];//每个位置上可能有多个雨伞 
10 int memo[2005][2005];//dp[i][j]代表拿着j雨伞走到i点【此时换完伞准备出发】的最小疲劳值,j=0代表不拿伞
11 
12 int main(){
13     int a,n,m; cin>>a>>n>>m;
14     for(int i=1;i<=n;i++){
15         int l,r; cin>>l>>r;
16         for(int j=l;j<r;j++) rain[j]=1;
17     }
18     for(int i=1;i<=a;i++) umb[i].push_back(0);
19     for(int i=1;i<=m;i++){
20         int x,p; cin>>x>>p;
21         umb[x].push_back(i);
22         id[i]=p;
23     }
24     
25     for(int i=0;i<=a;i++){
26         for(int j=0;j<=m;j++){
27             bool contain=false;
28             for(int k=0;k<umb[i].size();k++){
29                 if(umb[i][k]==j) contain=true;
30             }    
31             
32             if(rain[i] && j==0) memo[i][j]=INF;//在雨里还没有雨伞
33             else if(i==0){//在0点时特判
34                 if( !contain && j!=0 ) memo[i][j]=INF;
35                 else memo[i][j]=0;
36                 }
37             else if(contain){//在i点才拿起编号为j的雨伞
38                 int cost=INF;
39                 for(int v=0;v<=m;v++) cost=min(cost,memo[i-1][v]+id[v]);
40                 memo[i][j]=cost;
41                 }
42             else memo[i][j]=min(INF,memo[i-1][j]+id[j]);//到达i点前就拿到j雨伞
43             
44         //    cout<<i<<" "<<j<<" "<<memo[i][j]<<endl; 
45         }    
46     }
47     
48     
49     int ans=INF;
50     for(int i=0;i<=m;i++) ans=min(ans,memo[a][i]);
51 
52     if(ans==INF) cout<<-1;
53     else cout<<ans;
54 
55     return 0;
56 }

猜你喜欢

转载自www.cnblogs.com/ZhenghangHu/p/9140320.html