動態規劃求解(添 號求最小值和問題)

2021-08-29 20:56:21 字數 949 閱讀 1401

案例提出:在乙個n位整數a(只考慮正整數的情況)中插入r個加號,將它分成r+1個整數,找出一種加號的插入方法,使得這r+1個整數的和最小。

動態規劃設計要點:對於一般插入r個+號問題,採用列舉不適合。注意到插入r個+號是乙個多階層決策問題,所以採用動態規劃 來求解是最適宜的。

建立遞推關係

設f(i,k)表示在前i位數中插入k個加號所得和的最小值,a(i,j)表示從第i個數字到第j個數字所組成的j−i+1(i≤j)位整數值。

為了求f(i,k)的值,考察數字串的前i個數字,設前j(k≤jf(i,k)=min(f(j,k−1)+a(j+1,i))    (k≤j前j個數字沒有插入加號時的值顯然為前j個數字組成的整數,因而得邊界值為:

f(j,0)=a(1,j) (1≤j≤i)

#include#includevoid main()

printf("在整數%s中插入%d個加號,使和最小:\n",sr,r);

for(d=0,j=0;j<=n-1;j++)

b[j]=sr[j]-48;

for(i=1;i<=n;i++)

for(j=1;j<=r;j++)

f[i][j]=1e16;

for(d=0,j=1;j<=n;j++)

for(k=1;k<=r;k++)

for(i=k+1;i<=n;i++)

for(j=k;jf[j][k-1]+d)

}t[r]=c[n][r];

for(k=r-1;k>=1;k--)

t[k]=c[t[k+1]][k];

t[0]=0;

t[r+1]=n;

for(k=1;k<=r+1;k++)

printf("=%0.f\n",f[n][r]);

}

求區域性最小值問題

我們可以採用二分法,先判斷最後乙個元素和第乙個元素是否是區域性最小值,如果是否的話,那在陣列中肯定存在乙個區域性最小值的元素,繼續遍歷即可 public static int getlessindex int arr if arr.length 1 arr 0 arr 1 if arr arr.le...

滑動視窗求解最大 最小值問題

結論 求最大值時使用雙端對維護遞減資料,即佇列中資料依次遞減,佇列頭部資料始終為最大值,每次將遍歷到的資料與佇列尾部的資料進行比較 如果不違反佇列的遞減規律 遍歷到的資料元素小於佇列尾部資料 就直接插入佇列尾部 如果違反了佇列的遞減規律就依次從佇列尾部彈出資料,直到找到能夠保持佇列遞減規律的位置。求...

Problem E 求最大值和最小值

求出一些整數中的最大值和最小值。輸入為多行,以eof結束。每行為乙個十進位制的數字,全部由0 9組成,每行最長不超過1000個字元。有些數字會以0開頭 不影響數值大小的前導0 輸出為輸入中的最大值和最小值,格式見sample。02010001201223 the maximum value is 2...