jzoj1281-旅行【dp】
生活随笔
收集整理的這篇文章主要介紹了
jzoj1281-旅行【dp】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目大意
nnn個(gè)地方,第iii個(gè)高度為hih_ihi?。每次可以交換一個(gè)hjh_jhj?和hj+1h_{j+1}hj+1?但是要滿足操作的jjj遞增。
解題思路
也就是可以選擇若干個(gè)區(qū)間,然后將區(qū)間的頭部丟到尾部。
發(fā)現(xiàn)dpdpdp的瓶頸在于我們?cè)诿杜e下一個(gè)時(shí)無法知道上一個(gè)的具體高度,但是我們處理一個(gè)位置iii時(shí)發(fā)現(xiàn)如果下一個(gè)位置作為區(qū)間的起點(diǎn),那么下一個(gè)位置的高度就應(yīng)該是hi+1h_{i+1}hi+1?,否則就是hih_ihi?。
那么我們可以設(shè)fi,0/1f_{i,0/1}fi,0/1?表示到第iii個(gè),下一個(gè)是否作為區(qū)間的起點(diǎn)時(shí)的答案,然后就可以O(n2)O(n^2)O(n2)轉(zhuǎn)移了。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2100; ll n,a[N],s[N],f[N][2]; int main() {scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);s[i]=s[i-1]+abs(a[i]-a[i-1]);}memset(f,0x3f,sizeof(f));f[0][0]=f[0][1]=0;a[0]=a[1];for(ll i=1;i<=n;i++){for(ll j=0;j<i-1;j++){if(i==n)f[i][0]=min(f[i][0],f[j][1]+s[i]-s[j+2]+abs(a[i]-a[j+1]));else f[i][0]=min(f[i][0],f[j][1]+s[i]-s[j+2]+abs(a[i]-a[j+1])+abs(a[j+1]-a[i+1]));f[i][1]=min(f[i][1],f[j][1]+s[i]-s[j+2]+abs(a[i]-a[j+1])+abs(a[j+1]-a[i+2]));}if(i==n)f[i][0]=min(f[i][0],f[i-1][0]);else f[i][0]=min(f[i][0],f[i-1][0]+abs(a[i]-a[i+1]));f[i][1]=min(f[i][1],f[i-1][0]+abs(a[i]-a[i+2]));}printf("%lld",f[n][0]); }總結(jié)
以上是生活随笔為你收集整理的jzoj1281-旅行【dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机不小心进水了应该如何紧急处理手机进水
- 下一篇: jzoj1282-资源勘探【统计】