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; }