sicily 1176

来源:互联网 发布:java swing 表格控件 编辑:程序博客网 时间:2024/04/29 07:03
#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];elsereturn 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);elsetemp1 += Num[a] + dp(a+1, b-1);//case2选取右边的数开始if (Num[a] >= Num[b-1])temp2 += Num[b] + dp(a+1, b-1);elsetemp2 += Num[b] + dp(a, b-2);//进行动态规划的决策,即选取和大的数!if (temp1 > temp2)ans[a][b] = temp1;elseans[a][b] = temp2;return ans[a][b];}/*16 90 52 68 7 1 5 86 1000 35 69 57 2 1 0 200 88 8 7 6 5 4 3 2 14 1 1000 2 50010 100 5 6 3 4 7 8 6  1 10008 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 10004 3 2 10 48 1 2 3 4 5 6 7 88 2 2 1 5 3 8 7 30*/

 
原创粉丝点击