CSUOJ 1248 非變性聚丙烯醯胺凝膠電泳

2022-08-03 21:51:16 字數 1124 閱讀 5987

第二次做自己學校oj的題目,貢獻了三個tle,兩個re。。

其實這是一道非常非常經典的dp題。題目的意思,在標程裡面寫的很清楚了:從數列中選取若干個數,使其和與m的差的絕對值最小。

我開始想到的是那個分硬幣的題。那種近乎暴力的方法,在這道題目上用,tle了,因為這個資料的大小就是超了原來的想法,剛開始題目沒看清楚,以為能過的。

現在簡述一下解決這個問題:從數列中選取若干個數,使其和與m的差的絕對值最小 的思路。

我們用乙個陣列d[i][j]來表示/取到第i個數字時,在a[1],a[2]......,a[i]個中/任取若干個數/的和,使得/這個和/與j的差值/的絕對值/最小的時候/的這個差值。

當i=0時,d[0][j]=-j,因為乙個都沒取的時候,跟j的差值顯然是j。這個就是邊界條件了。

再看一般情況。這個時候的狀態轉移方程是dp(i,j)=min

為了讓自己更明白,自己給自己重新解釋一遍:

當遇到第i個數字時,a[i]可以不取。這個時候dp(i,j)=dp(i-1,j)

如果取了,就要看j的大小了,所以dp(i,j)= dp(i-1,j-a[j])【a[j]j】

剩下的就是一些細節問題了,下面是**:

view code

1 #include 2 #include 3 #include 4

using

namespace

std;

5int d[1001][1001];//

dp陣列

6int a[1001];//

記錄每個氨基酸的分子量

7int dp(int c,intw)8

17else

1832

else

33 ans = abs(r) < abs(t) ?r : t;34}

35return

ans;36}

37int

main()

3848

for(i = 0;i <= c;i++)

49for(j = 0;j <= w - 18;j++)

50 d[i][j] = 2000

;51 cout<

53 }

1 24學習計畫

1 在我們第乙個課題的基礎上。改寫定時器中斷的內容,做到每隔1s閃爍,再每隔2s閃爍,再隔3s閃爍,然後一直這樣迴圈,其他的led還有示波器都和原來的要求一樣。一遍一遍的對照著led0開始計算led1是不是已經達到了迴圈的要求。1 每隔一秒閃爍 則週期為2 每隔2s閃爍則週期為4 每隔3s閃爍,週期...

CSU OJ 集訓難度(線段樹)

小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的...

12 4 友元函式

類中的私有成員和保護成員是只能類內訪問,但在某些特殊情況,我們希望類外也能訪問,這就要用到友元技術。在類中宣告該函式並在前面加上friend關鍵字,這樣函式就可以暢通無阻地訪問私有和保護成員了。12.4.1 全域性函式做友元 include include using namespace std c...