Road Optimization (CFD2, C) (DP) (反序思维)

 

 

思路:

  • 发现数据范围500, 时间复杂度为 n^3 于是明显DP
  •  当然这里面有一个贪心思路, 当前的点比前面一个点的速度低,就没有必要删除
  • 但是这里的dp不用这个贪心,不然实现上复杂一点
  • 直接就连续删除就行, 因为DP的时候一定会把最优的更新出来
  • 然后这里有一个问题, 就是不知道那个点删了没有, 就正着推就行了
  • 但是 现在想了一想, 我们可以直接给DP,经行限制就行了, 让dp表示当前这个点没有被删掉就行了
#include <bits/stdc++.h>
using namespace std;
#define ri int 
#define M 505

int n,m,K;
long long dp[M][M];
int T;
long long a[M],b[M];


int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    cin>>n>>m>>K;
    for(ri i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    a[n+1]=m;
    for(ri i=1;i<=n;i++)
    {
        cin>>b[i];
    }

    memset(dp,0x3f,sizeof(dp));
    dp[1][0]=0;
    for(ri i=1;i<=n;i++)
    {
        for(ri j=0;j<=K;j++)
        {
            for(ri k=0;k+j<=K&&i+k+1<=n+1;k++)
            {
                dp[i+k+1][k+j]=min(dp[i+k+1][k+j],dp[i][j]+(a[i+k+1]-a[i])*b[i]);
            }
        }
    }
    long long ans=1e18;
    for(ri i=0;i<=K;i++) ans=min(ans,dp[n+1][i]);
    cout<<ans;
    return 0;
}
View Code

 

posted @ 2023-03-02 20:59  VxiaohuanV  阅读(24)  评论(0编辑  收藏  举报