线性dp——cf988F

不是很难,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';
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/11163045.html