您的位置:首页 > 其它

sicily 1176

2011-11-29 12:39 274 查看
#include "iostream"
#include "memory.h"
using namespace std;

int Num[1010];//存储输入的数字
int ans[1010][1010];//对每一次决策后结果的存储!
int dp(int a, int b);//动态规划方法的实现

int main()
{
int n, count = 0;
while (cin >> n && n)
{
int sum = 0;
count++;
memset(Num, 0, sizeof (Num));
memset(ans, -1, sizeof(ans));
for (int i = 1; i <= n; i++)
{
cin >> Num[i];
sum += Num[i];
}
int differ1 = dp(1, n);//选手1决策所得的和
int differ2 = sum - differ1;//选手2决策所得的和
cout<<"In game "<< count <<", the greedy strategy might lose by as many as "<< differ1 - differ2 <<" points."<<endl;
}
}

int dp(int a, int b)
{
int temp1 = 0, temp2 = 0;
if ((b-a)==1)//到最后只剩下两个数的时候就需要贪婪算法了!
{
if (Num[a] > Num[b])
return ans[a][b] = Num[a];
else
return ans[a][b] = Num[b];
}
if (ans[a][b] != -1)
return ans[a][b];
//case1先选取左边的数开始
if (Num[a+1] >= Num[b])
temp1 += Num[a] + dp(a+2, b);
else
temp1 += Num[a] + dp(a+1, b-1);

//case2选取右边的数开始
if (Num[a] >= Num[b-1])
temp2 += Num[b] + dp(a+1, b-1);
else
temp2 += Num[b] + dp(a, b-2);

//进行动态规划的决策,即选取和大的数!
if (temp1 > temp2)
ans[a][b] = temp1;
else
ans[a][b] = temp2;
return ans[a][b];
}

/*
16 90 52 68 7 1 5 86 1000 35 69 57 2 1 0 200 8
8 8 7 6 5 4 3 2 1
4 1 1000 2 500
10 100 5 6 3 4 7 8 6  1 1000
8 1 1 1 1 1 1 1 1
8 0 0 0 0 0 0 0 0
20 1000 2 90 58 76 500 6 1 4 3 962 3 3 4 4 76 58 90 2 1000
4 3 2 10 4
8 1 2 3 4 5 6 7 8
8 2 2 1 5 3 8 7 3
0
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: