取數遊戲 dp

https://nanti.jisuanke.com/t/48

有如下一個雙人遊戲:N個正整數的序列放在一個遊戲平臺上,兩人輪流從序列的兩端取數,每次有數字被一個玩家取走後,這個數字被從序列中去掉並累加到取走該數的玩家的得分中,當數取盡時,遊戲結束。以最終得分多者爲勝。

編一個執行最優策略的程序,最優策略就是使自己能得到在當前情況下最大的可能的總分的策略。你的程序要始終爲兩位玩家執行最優策略。

輸入第1行包括一個正整數N(2≤N≤100), 表示序列中正整數的個數。輸入第2行包含用空格分隔的N個正整數(1≤所有正整數≤200)。

只有一行,用空格分隔的兩個整數: 依次爲先取數玩家和後取數玩家的最終得分。

樣例輸入複製

6 
4 7 2 9 5 2

樣例輸出複製

18 11
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int d,n,w[210];
int dp[2][210][210];
int DP(int i,int j,int k)
{
	if(dp[k][i][j]>0) return dp[k][i][j];
	int res;
	dp[1][i][j]=max(w[i]+DP(i+1,j,0),w[j]+DP(i,j-1,0));
	dp[0][i][j]=min(DP(i+1,j,1),DP(i,j-1,1));
	return dp[k][i][j];
}
int main()
{
    cin>>n;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<n+1;i++)
    cin>>w[i];
	for(int i=1;i<n;i++)
	{
		dp[1][i][i+1]=max(w[i],w[i+1]);
		dp[0][i][i+1]=min(w[i],w[i+1]);
		dp[1][i][i]=w[i];
		dp[1][i+1][i+1]=w[i+1];
	}
	cout<<DP(1,n,1)<<" "<<DP(1,n,0)<<endl;
   	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章