[USACO07NOV] Telephone Wire G

dp题,做法有点套路但是一开始没想到。
\(dp{_i}_j\) 表示第 \(i\) 位为 \(j\) 的最小花费。
然后直接往下转移就好了。

点击查看代码
#include<bits/stdc++.h>
#define fir first
#define sec second
#define ll long long
#define pii pair<int,int>
#define e_b emplace_back 
#define p_b push_back
#define il inline
#define ios ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
const int N=1e5+1;
int n;
ll a[N],h,dp[N][101],ans=1e18,c;
signed main(){
    ios;cin>>n>>c;
    for(int i=1;i<=n;i++){cin>>a[i];h=max(h,a[i]);}
    for(int i=1;i<=n;i++)
        for(int j=1;j<=h;j++)
            dp[i][j]=1e18;
    for(int i=a[1];i<=h;i++){
        ll w=(i-a[1])*(i-a[1]);
        dp[1][i]=w;
    }
    for(int i=2;i<=n;i++)
        for(int j=a[i];j<=h;j++)
            for(int k=a[i-1];k<=h;k++){
                ll w=(j-a[i])*(j-a[i]);
                dp[i][j]=min(dp[i][j],dp[i-1][k]+w+c*abs(j-k));
            }
    for(int i=a[n];i<=h;i++)ans=min(dp[n][i],ans);
    cout<<ans;
    return 0;
}
posted @ 2025-10-10 20:00  zhuoheng  阅读(7)  评论(0)    收藏  举报