日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

天池 在线编程 双向取数(博弈DP)

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 天池 在线编程 双向取数(博弈DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

https://tianchi.aliyun.com/oj/245679029019779851/254275128279634585

有一個長度為n的數列arr, 甲乙兩個人每次可以從頭或者從末尾取一個數,雙方都想讓自己取數之和盡量多,
甲先取數,問甲乙在采取最優策略的基礎下,甲最多得多少分?

n<=800示例 給定arr=[8,6,9,4,4,3],返回21 給定arr=[1,3,5,8,7,9,1],返回14

2. 解題

相關題目:LeetCode 博弈DP系列

  • dp[i][j] 表示 剩下的數字的區間為 [i,j] 時,先手的最大分差,使用區間DP求取
  • 假設 兩人的最佳得分為 a(先手), b, 有 a+b=sum,a?b=dp[0][n?1]a+b = sum, a-b = dp[0][n-1]a+b=suma?b=dp[0][n?1],解方程即得到 a
class Solution { public:/*** @param arr: the number array* @return: output the maximal score Alice can get*/int getAns(vector<int> &arr) {// Write your code hereint n = arr.size();int sum = accumulate(arr.begin(), arr.end(), 0);//總的分數vector<vector<int>> dp(n, vector<int>(n, 0));for(int i = 0; i < n; i++) dp[i][i] = arr[i];//只剩一個數字時的得分for(int len = 1; len <= n; len++){for(int i = 0; i+len < n; i++){int j = i+len;dp[i][j] = max(-dp[i+1][j]+arr[i], -dp[i][j-1]+arr[j]);// 上一個人的分差取負就是我的分差,加上我的得分,兩種選擇取大的}}return (sum+dp[0][n-1])/2;} };

50ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的天池 在线编程 双向取数(博弈DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。