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 */
相关文章推荐
- sicily 1176 two ends
- sicily 1176. Two Ends
- [sicily]1176. Two Ends
- sicily 1176.Two ends
- Sicily 1176. Two Ends
- Sicily 1176. Two Ends
- sicily 1176 (动态规划)
- sicily 1176 two ends 动态规划解题
- [Sicily 1176 Two Ends] 动态规划 记忆化搜索
- Sicily 1176. Two Ends
- sicily 1176 Two Ends
- Sicily1176
- sicily 1176 Two Ends dp(记忆化搜索)
- sicily 1176. Two Ends
- sicily 1176 Two ends
- sicily 1176 Two Ends
- sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)
- Sicily 1176. Two Ends
- sicily 1176
- Sicily 1176 Two Ends