案例提出:在乙個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...