POJ3666-Making the Grade【线性dp】
生活随笔
收集整理的這篇文章主要介紹了
POJ3666-Making the Grade【线性dp】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目鏈接:http://poj.org/problem?id=3666
題目大意
給定序列A,B。要求B嚴(yán)格單調(diào),要求最小化
解題思路
根據(jù)書(shū)上說(shuō)的數(shù)學(xué)歸納法,我們可以證明在S最小化的條件下,一定存在一種構(gòu)造B的方案,使得B中的數(shù)值都在A中出現(xiàn)過(guò)書(shū)上原話。
fi,jfi,j表示完成前i個(gè)數(shù),BiBi為jj時(shí)的最小SS。
然后我們得出方程
但是這是十分的慢的,所以我們可以用變量記錄最小的 fi?1,kfi?1,k,然后離散化A數(shù)組,枚舉的時(shí)候直接用離散化之后的A
code
#include<cstdio> #include<algorithm> using namespace std; int n,ans,a[2001],b[2001],f[2001][2001],val; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+1+n);//離散化 ans=2147483647; for(int i=1;i<=n;i++) { val=2147483647; for(int j=1;j<=n;j++) { val=min(val,f[i-1][j]);//最小的 f[i][j]=val+abs(a[i]-b[j]);//動(dòng)態(tài)轉(zhuǎn)移 if(i==n) ans=min(ans,f[i][j]);//統(tǒng)計(jì)答案 } } printf("%d",ans); }總結(jié)
以上是生活随笔為你收集整理的POJ3666-Making the Grade【线性dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美工电脑配置要求(美工 电脑配置)
- 下一篇: JoyOI(TYVJ)1061-Mobi