作業:
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]);//上司不參加,下屬可以參加也可以不參加於是帶入dfs進行遞迴處理即可。f[i][1]=w[i]+f[x][0];//上司參加,下屬只能不參加
**:
#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 大 的正整數。...