不是很难,dp[i]表示到位置i的最小花费
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 2005 struct Node {int pos,w;}p[maxn]; struct Seg {int l,r;}seg[maxn]; int n,m,a,f[maxn]; ll dp[maxn]; int cmp(Node a,Node b){return a.pos<b.pos;} int main(){ cin>>a>>n>>m; for(int i=1;i<=n;i++){ cin>>seg[i].l>>seg[i].r; for(int k=seg[i].l+1;k<=seg[i].r;k++) f[k]=1; } for(int i=1;i<=m;i++) cin>>p[i].pos>>p[i].w,p[i].pos++; sort(p+1,p+1+m,cmp); int first=0x3f3f3f3f,last=0; for(int i=a;i>=1;i--) if(f[i]){ first=min(first,i); last=max(last,i); } if(first<p[1].pos){puts("-1");return 0;} for(int i=1;i<=m;i++){ int s; for(s=p[i].pos-1;s>=1;s--) if(f[s])break; for(int j=p[i].pos;j<=last;j++) if(dp[j]==0) dp[j]=dp[s]+(j-p[i].pos+1)*p[i].w; else dp[j]=min(dp[j],dp[s]+(j-p[i].pos+1)*p[i].w); } cout<<dp[last]<<'\n'; }