某次做dp題

2021-07-05 14:16:15 字數 2995 閱讀 9940

【問題描述】

在一圓形操場四周擺放n 堆石子, 現要將石子有次序地合併成一堆.規定每次只能選相鄰的

兩堆合併成一堆,並將新的一堆的石子數,記為該次合併的得分。

編一程式,由檔案讀入堆數n 及每堆石子數,

(1)選擇一種合併石子的方案,使得做n-1 次合併,得分的總和最少

(2)選擇一種合併石子的方案,使得做n-1 次合併,得分的總和最大

【輸入】

第1 行:1 個整數n,表示石子的數量

第2 行:n 個用空格分開的整數,表示各堆石子的數量。

【輸出】

第1 行:1 個整數,表示最小的歸併代價

第2 行:1 個整數,表示最大的歸併代價

【輸入輸出樣例1】

3 13 7 8

43 49

【資料說明】

對於20%的資料,n ≤ 10

對於40%的資料,n ≤ 20

對於70%的資料,n ≤ 50

對於100%的資料,n ≤ 100,每堆石子數量不超過10000

分析:

很明顯經典的動態規劃題,只是這次是環形的而已,把陣列加倍,變成線性的。

定義dp[i][j] 從 i 到 j 的最值

定義l 列舉長度 2–2*n i 起始 j終止

則 1< i< 2*n-l-1 j=i+l-1

列舉斷點k

dp[i][j]=max/min(dpmax[i][k]+dpmax[k+1][j]+sum[j]-sum[i-1])

sum 為字首和。

#include

#include

#include

#define mem(a,x) memset(a,x,sizeof(a))

using namespace std;

const int inf=0x3f3f3f3f;

int n;

int a[105],sum[205];

int dpmax[205][205],dpmin[205][205];

void init()

void readdata()

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

// cout

sum[i] = sum[i-1] +sum[i-n]-sum[i-n-1];

}void work()

dpmin[i][j]=minv;

dpmax[i][j]=maxv;

} }}

int main()

printf("%d\n",ansmin);

printf("%d",ansmax);

return

0;}

【問題描述】

在一場訓練賽中,姜神帶領他們隊ak 全場後,顯得特別無聊,無意中寫下n 個正整數,突

然靈機一動想出了一道美妙的題目。

姜神從這n 個正整數中選出一些數,組成乙個非遞減的子串行,很容易就可以知道,有多少

個由正整數組成的長度跟這個子串行相等的序列比當前這個子串行小。

乙個序列x = x1,x2,…xr 比另乙個序列y = y1,y2,…yr 小,當且僅當,

對於任意的i ( 1 ≤ i ≤ r),xi ≤ yi

現在姜神想知道,對於所有不同的非遞減子串行,一共有多少個這樣的序列。

【輸入】

第1 行:1 個正整數n

第2 行:n 個用空格分開的整數

【輸出】

第1 行:1 個整數, 表示一共有多少個序列滿足要求,由於結果可能很大,輸出除以

1000000007 後的餘數。

【輸入輸出樣例1】

3 1 2 2

分析:

這題求數量當然也可以看做是乙個動態規劃。

然而難點在於去重。

要全過還需要離散化。

#include 

#include

using

namespace

std;

#define maxn 100010

#define mo 1000000007

typedef

long

long ll;

int n;

ll tree[maxn],f[maxn],dec[maxn];

struct node

ll pretot(int i)

void solve()

sort(a+1,a+1+n,cmp);

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

sort(a+1,a+1+n);

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

printf("%d\n",ans);

}int main()

最長上公升子串行 定義略。

有一天,leego 拿到了乙個序列,他知道乙個序列的最長上公升子串行可以有多個,所以它把

這個序列的每個下標i 分成了3 類:

1. i a 不屬於任何最長上公升子串行

2. i a 屬於至少乙個但非所有最長上公升子串行

3. i a 屬於所有最長上公升子串行

想在leego 請你幫助他,寫乙個程式,將所有下標i 分類。

【輸入】

第1 行:1 個整數n,表示序列的長度

第2 行:n 個用空格分開的整數,表示序列的元素

【輸出】

輸出乙個含n 個字元的字串,第i 個字元表示下標i 的型別。

【輸入輸出樣例1】 1 4

3 【輸入輸出樣例2】

4 1 3 2 5

3223

【輸入輸出樣例3】

4 1 5 2 3

分析:

此題可以順著跑一遍 然後倒著跑一遍。

然後判斷是否同時出現過。

期望dp好題選做

最近連考兩場期望dp的題目,sir說十分板子的題目我竟然一點也不會,而且講過以後也覺得很不可改。於是開個坑。明明有 o mlog 的寫法,但是 m 等於 500 就讓人十分迷惑。當然我並沒有推出來 以下式子來自這裡 emm,目前覺得deepinc的式子最好理解,也最好寫 其實我就看懂了乙個 下面的 ...

某次筆試不會做的題

正規表示式的用途 測試字串內的模式。例如,可以測試輸入字串,以檢視字串內是否出現 號碼模式或信用卡號碼模式。這稱為數 據驗證。替換文字。可以使用正規表示式來識別文件中的特定文字,完全刪除該文字或者用其他文字替換它。基於模式匹配從字串中提取子字串。可以查詢文件內或輸入域內特定的文字。sendmessa...

留著以後慢慢做的數字DP(題表)

推薦 hdu 2089 不要62 hdu 3555不能出現連續的49 hdu 3652 出現13,而且能被13整除。hdu 3709 平衡數 hdu 4507 和7無關數的平方和 hdu 3886求滿足符號串的數字個數。hdu 4352嚴格上公升子串行的長度為k的個數。lightoj 1140兩個數...