uva10891(DP 博弈)
2014-12-18 18:46
351 查看
题目的意思就是,有一组数字,每次可以从左边,或者从右边,取走连续的若干个数字.
然后两个取,A先取,B后取,两个人都是尽量使自己比对方取的分数多.
问最后A比B多多少.
首先我们用f[i][j]表示在取 i 到 j 范围内的数字,先取的人最大取到几.
我们每次计算时,就找它这个区间中间的连续区间,f[i][k] f[k][j] (k从i到j) 然后把最小的值找出来,那么f[i][j]就等于这个区间所有数字的和减去这个最小值.
AC代码:
然后两个取,A先取,B后取,两个人都是尽量使自己比对方取的分数多.
问最后A比B多多少.
首先我们用f[i][j]表示在取 i 到 j 范围内的数字,先取的人最大取到几.
我们每次计算时,就找它这个区间中间的连续区间,f[i][k] f[k][j] (k从i到j) 然后把最小的值找出来,那么f[i][j]就等于这个区间所有数字的和减去这个最小值.
AC代码:
#include<stdio.h> #include<string.h> #include<math.h> const int N = 105; int num ; int sum ; int n ; int f ; int main() { sum[0] = 0; while(scanf("%d",&n) && n != 0) { for (int i = 1 ; i <= n ;i++) { scanf("%d",&num[i]); sum[i] = sum[i - 1] + num[i]; } memset(f , 0 , sizeof(f)); for (int i = 1 ; i <= n ;i++) { f[i][i] = num[i]; } for (int i = 1 ; i <= n ;i++) { for(int j = 1 ; i + j <= n ;j++) { int r = i + j; int s = sum[i + j] - sum[j -1]; int m = 0 ; for (int k = j ; k <= r ;k++) { m = m < f[j][k] ? m : f[j][k]; m = m < f[k][r] ? m : f[k][r]; } f[j][r] =s - m; } } printf("%d\n",f[1] - (sum - f[1] )); } }
相关文章推荐
- UVA 10891 Game of Sum(dp博弈)
- UVA - 10891 Game of Sum 区间DP博弈
- UVA - 10891 Game of Sum 区间DP(博弈DP)循环写法
- UVA 10891(区间dp或者极大极小博弈)
- Uva 10891 Game of Sum(区间博弈dp)
- UVA 10891 Game of Sum 博弈DP -
- UVa 10891 Game of Sum(博弈区间DP)
- uva 10891 - Game of Sum(博弈,区间dp)
- UVA 10891 区间DP+博弈思想
- Uva 10891 经典博弈区间DP
- UVA - 10891 Game of Sum 区间DP(博弈DP)
- uva_10891 - Game of Sum( 博弈区间DP )
- uva10891 Game of Sum 博弈区间dp
- UVa 10891 Game of Sum (区间DP&博弈)
- UVa 10891 Game of Sum(经典博弈区间DP)
- UVA 10891 Game of Sum(区间博弈dp)***
- hdu 4597 + uva 10891(一类区间dp)
- UVA 10891-Game of Sum(基础DP)
- UVA 10891 - Game of Sum(DP)
- UVA 10891 Game of Sum(区间DP)