記錄week13的作業後三道題

2021-10-23 06:58:02 字數 2902 閱讀 8414

作業:

c題:免費**:

題目類似一座樹塔,在0-10範圍內,某一秒會在若干個位置有餡餅,然後我們要求能接住的最多的餡餅。

首先我們構建乙個二維陣列,儲存某個時間,某個位置的餡餅數目。**dp[t][x]**表示在t時刻,x位置有dp[t][x]個餡餅。

然後總結狀態方程:

dp[t][x]=max(dp[t-1][x],dp[t-1][x-1],dp[t-1][x+1])+dp[t][x]

然後在寫的時候發現:他不對,因為你初始時在5位置,從t=1開始,無法判斷他的**是否合法,也就是可能會出現t=1時刻,x位置屬於0-3或者7-10。但是根據規則,一秒只能移動乙個單位長度,所以不合法。

於是倒著看,從最後乙個時刻往前數,在中間經過n個狀態之後,最後乙個時刻可能在任意位置。而遍歷到開始的時刻的時候,由於初始化的dp矩陣中其他位置都是0,所以不影響判斷,只需要輸出dp[0][5]即可。

相應的狀態轉移方程如下:

dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1]);

**:

#include

using

namespace std;

#define inf 0x3f3f3f3f

int m;

int dp[

100010][

12];int

main()

//dp[t][x]=max(dp[t-1][x],dp[t-1][x-1],dp[t-1][x+1])+dp[t][x]

dp[0]

[5]=

0;for(

int i=maxt-

1;i>=

0;i--

)dp[i][10

]+=max

(dp[i+1]

[9],dp[i+1]

[10])

;} cout<[5

]<}return0;

}

d題:

經典的題目:沒有上司的舞會。這是一道樹形dp,因為輸入的是一棵樹的邊。開始我們用前向星構建一棵樹,然後根據出度和入度找出他的根節點,並且給葉子節點賦值。

令f[i][0/1]為以i節點為根的能得到的最大快樂值。第二維表示i這個點算不算進去。

於是得到遞迴表示式:

f[i][0]=max( f[x][1],f[x][0]);//上司不參加,下屬可以參加也可以不參加

f[i][1]=w[i]+f[x][0];//上司參加,下屬只能不參加

於是帶入dfs進行遞迴處理即可。

**:

#include

using

namespace std;

#define m 6005

struct node

edge[m*2]

;int head[m*2]

;int cnt;

void

add(

int x,

int y)

int w[m]

,ru[m]

,chu[m]

;int rt;

int dp[m]

[m];

//以u為根節點的子樹 最大是多少 fa記錄他爹

void

dfs(

int u,

int fa)

}int

main()

dfs(rt,0)

; cout<<

max(dp[rt][0

],dp[rt][1

])

}

e題

max sum of max-k-sub-sequence:

單調佇列處理的題目,類似之前做的滑動視窗。這道題是乙個環,我們在這個環上,找出乙個連續的不超過k長度的序列,使這個序列的每個元素之和最大。

首先定義乙個雙端佇列deque,作為單調佇列使用。我們為了表示序列的和,降低其複雜度,使用字首和表示區間和。即構造字首和,使得s[i]-s[j]=a[j+1]+a[j+2]+…+a[i-1]+a[i].

按照題意:我們求要求出 [i-k,i] 的區間上的最小的那個字首和s[j]使得s[i]-s[j]最大,即令區間 [j+1,i] 內的各個元素的和最大。為了解決環的問題,我們將陣列擴大兩倍。n個元素,區間為k我們只需要遍歷到n+k-1即可包含環中的所有情況。

**:

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

int t,n,k;

long

long

int b[2*

100010

],sum[2*

100010];

intmain()

for(

int i=

1;i<=

2*n;i++

)sum[i]

=sum[i-1]

+b[i]

;for

(int i=

1;i<=n+k-

1;i++

) ans=

max(ans,sum[i]

-sum[q.

front()

]);}

printf

("%lld %d %d\n"

,ans,l>n?l-n:l,r>n?r-n:r);}

return0;

}

Week13作業 C TT的獎勵 dp

在大家不辭辛勞的幫助下,tt 順利地完成了所有的神秘任務。神秘人很高興,決定給 tt 乙個獎勵,即白日做夢之撿貓咪遊戲。撿貓咪遊戲是這樣的,貓咪從天上往下掉,且只會掉在 0,10 範圍內的整數。tt 初始站在位置五上,且每秒只能在移動不超過一公尺的範圍內接住掉落的貓咪,如果沒有接住,貓咪就會跑掉。例...

《程式設計思維與實踐》week13 作業題

這一天,tt 遇到了乙個神秘人。神秘人給了兩個數字,分別表示 n 和 k,並要求 tt 給出 k 個奇偶性相同的正整數,使得其和等於 n。例如 n 10,k 3,答案可以為 4 2 4 tt 覺得這個任務太簡單了,不願意做,你能幫他完成嗎?本題是spj 第一行乙個整數 t,表示資料組數,不超過 10...

week13作業B TT的神秘任務2

題目 在你們的幫助下,tt 輕鬆地完成了上乙個神秘任務。但是令人沒有想到的是,幾天後,tt 再次遇到了那個神秘人。而這一次,神秘人決定加大難度,並許諾 tt,如果能夠完成便給他乙個獎勵。任務依舊只給了兩個數字,分別表示 n 和 k,不過這一次是要求 tt 給出無法被 n 整除的第 k 大 的正整數。...