fj打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當上公升或下降,也就是說,高度上公升與高度下降的路不能同時出現在修好的路中。 整條路被分成了n段,n個整數a_1, ... , a_n 依次描述了每一段路的高度。fj希望找到乙個恰好含n個元素的不上公升或不下降序列b_1, ... , b_n,作為修過的路中每個路段的高度。由於將每一段路墊高或挖低乙個單位的花費相同,修路的總支出可以表示為: |a_1 - b_1| + |a_2 - b_2| + ... + |a_n - b_n| 請你計算一下,fj在這項工程上的最小支出是多少。fj向你保證,這個支出不會超過2^31-1。
第1行: 輸入1個整數:n
第2..n+1行: 第i+1行為1個整數:a_i
輸出1個正整數,表示fj把路修成高度不上公升或高度不下降的最小花費
713
2453
9
3
1 <= n <= 2,000
0 <= a_i <= 1,000,000,000
fj將第乙個高度為3的路段的高度減少為2,將第二個高度為3的路段的高度增加到5,總花費為|2-3|+|5-3| = 3,並且各路段的高度為乙個不下降序列 1,2,2,4,5,5,9。
先排序,用x記錄
f[i][j]表示到了第i個數高度為第j高的修改數量。
f[i][j]=
min(f[i][j-1
],f[i-1
][j]+
abs(a[i]-x[j]));
然後把陣列反過來再來一遍就行了
#include#include#includeusing namespace std;
int a[2005],f[2005][2005],b[2005],x[2005];
int abs(int n)
int main()
sort(x+1,x+n+1);
for(i=1;i<=n;i++)
else
if(i==n)
} }for(i=1;i<=n;i++)
else
if(i==n)
} }printf("%d\n",s);
return 0;
}
動態規劃21
如下所示的由正整數數字構成的三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。注意 路徑上的每一步只能從乙個數走到下一層上和它最...
動態規劃 2 1
public intcrosssum int nums,int left,int righ,int p int rightsubsum integer.min value currsum 0 for int i p 1 i i return leftsubsum rightsubsum public...
力扣刷題 837 新21點 動態規劃 滑動視窗
過程模擬 抽乙個數字累計到當前的總積分 i 然後做判斷,如果 i 小於 k 則繼續抽下乙個數字,直到累計積分大於等於 k 則停止整個過程。當前的積分 i 是在上一步的基礎上抽取乙個數字得到的,有以下幾種情況 因此得到當前積分 i 的概率為以上所有情況的概率之和。不超過n的概率即為從 k 到 n 各概...