等会写题解,先把代码发上来
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 }