Codeforces Round #304 (Div. 2) C. Basketball Exercise (DP)
阿新 • • 發佈:2020-10-24
-
題意:給你兩個長度相同的陣列,每次從兩個陣列中選數(也可以不選),但是不可以在同一個陣列中連續選兩次,問能選的最大值是多少?
-
題解:dp,\(dp[i][0]\)表示第\(i\)個位置不選,\(dp[i][1]\)表示第\(i\)個位置選第一個陣列的數,同理\(dp[i][2]\)就是第二個,不選的話,\(dp[i][0]\)可以從上個位置的第一個和第二個的最大值轉移而來,而\(dp[i][1]\)可以從上個位置的第二個陣列或者不選的轉移而來,\(dp[i][2]\)也是同理,具體看程式碼.
-
程式碼:
int n; ll h1[N],h2[N]; ll dp[N][3]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;++i) cin>>h1[i]; for(int i=1;i<=n;++i) cin>>h2[i]; for(int i=1;i<=n;++i){ dp[i][0]=max(dp[i-1][1],dp[i-1][2]); dp[i][1]=max(dp[i-1][2]+h1[i],dp[i-1][0]+h1[i]); dp[i][2]=max(dp[i-1][1]+h2[i],dp[i-1][0]+h2[i]); } cout<<max({dp[n][0],dp[n][1],dp[n][2]})<<endl; return 0; }