計蒜客卡牌遊戲

2021-08-20 06:57:53 字數 903 閱讀 9990

問題描述:

蒜頭君手裡有 n 張卡牌,編號從 1 到 n,每張卡牌上面有乙個數字 num  i ​  。現在蒜頭君將 n 張卡牌排成一行,組成乙個序列,執行以下操作:從序列中抽取一張編號為 i 的卡牌,則該張卡牌貢獻的得分為 num  i−1 ​  ×num  i ​  ×num  i+1 ​  ,即卡牌上的數字同左右兩張相鄰的卡牌上的數字乘積。但是不能抽取序列中最左邊和最右邊的卡牌,即  i≠1 且 i≠n。抽到的卡牌就從序列中去掉。重複上述操作,直到序列裡只剩兩張卡牌。抽取的總得分為每次抽取的得分之和。  現在蒜頭君想知道,怎麼進行卡牌抽取,可以使得總得分最小。

輸入格式:

輸入有兩行。第一行輸入乙個整數 n(3≤n≤100),表示一共有 n 張卡牌。  第二行輸入 n 個整數 num  i (1≤num  i ​  ≤100),表示 n 張卡牌上面的數字。

輸出格式:

輸出一行,輸出乙個整數,表示卡牌抽取的最小總得分。

樣例輸入:

5 20 30 5 18 3 

樣例輸出:2520

思路:dp[i][j]表示從將第i張到第j張牌都抽出來的最小值。若要保證dp[i][j]值不變,則需保證a[i-1]與a[j+1]值不變。假設在i到j其中最後抽出第k張牌,則抽出的價值為w[k]=a[i-1]*a[k]*a[j+1],而前面和後面區間抽出的總價值不變。所以dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+w[k])。

**:

#includeusing namespace std;

const int n=110;

int n,a[n],w[n],dp[n][n];

int main()

printf("%d",dp[2][n-1]);

return 0;

}

計蒜客 16877 卡牌遊戲

題目鏈結 題目大意 桌子上有n堆牌,每堆牌有si張,每張牌上有個數。小明和小紅玩遊戲,小紅女士優先,每次從任意乙個牌堆頂部取出一張,小明長得醜,每次從任意乙個牌堆底部取一張。假設他倆都按照最優的方式取牌,那麼誰最後得到的所有牌的數字的和大。解題思路 首先我們考慮牌個數為偶數的幾堆,那麼你會發現,無論...

計蒜客 乘法遊戲

乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是10 1 50 ...

計蒜客 跳躍遊戲

給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 return true.a 3,2,1,0,4 return false.格式 第一行輸入乙個正整數n,接下來的一行,輸...