UVA 10891 Game of Sum
2014-06-16 20:52
281 查看
递归式的DP加上状态查重,复杂度为n*n*n,书上还有n*n复杂度的算法,先把低效的实现代码粘上来,随后再实现高效的。
下面是复杂度n*n的算法,dp数值的计算利用了递推进行加速,不再是递归形式了
优化前后的运行时间如下:
优化效果还是比较明显的,下面是代码:
#include <stdio.h> const int max_n = 100+5; int arr[max_n]; long long sum[max_n]; long long dp[max_n][max_n]; bool visited[max_n][max_n]; int get_dp(int i, int j){ if(visited[i][j]) return dp[i][j]; if(i == j){ visited[i][j] = true; dp[i][j] = arr[i]; return arr[i]; } long long min_value; int ii, jj; min_value = 0; for(ii=i+1; ii<=j; ii++){ if(get_dp(ii, j) < min_value) min_value = get_dp(ii, j); } for(jj=j-1; jj>=i; jj--){ if(get_dp(i, jj) < min_value) min_value = get_dp(i, jj); } visited[i][j] = true; dp[i][j] = sum[j]-sum[i-1]-min_value; return dp[i][j]; } void func(int n){ int i, j; for(i=1; i<=n; i++){ for(j=1; j<=n; j++) visited[i][j] = false; } for(i=1; i<=n; i++){ sum[i] = sum[i-1] + arr[i]; } printf("%lld\n", 2*get_dp(1, n)-sum ); } int main(void){ int n, i; //freopen("input.dat", "r", stdin); while(scanf("%d", &n), n){ for(i=1; i<=n; i++) scanf("%d", arr+i); func(n); } return 0; }
下面是复杂度n*n的算法,dp数值的计算利用了递推进行加速,不再是递归形式了
优化前后的运行时间如下:
优化效果还是比较明显的,下面是代码:
#include <stdio.h> const int max_n = 100+5; int arr[max_n]; long long dp[max_n][max_n]; long long f[max_n][max_n]; long long g[max_n][max_n]; long long sum[max_n]; long long _min3(long long a, long long b, long long c){ long long ret = a; if(b < ret) ret = b; if(c < ret) ret = c; return ret; } long long _min2(long long a, long long b){ return a<b ? a : b; } void func(int n){ int i, j; for(i=1; i<=n; i++) sum[i] = sum[i-1] + arr[i]; for(i=n; i>=1; i--){ for(j=i; j<=n; j++){ if(i == j){ dp[i][j] = arr[i]; f[i][j] = arr[i]; g[i][j] = arr[i]; } else{ dp[i][j] = sum[j]-sum[i-1]-_min3(f[i+1][j], g[i][j-1], 0); f[i][j] = _min2(f[i+1][j], dp[i][j]); g[i][j] = _min2(g[i][j-1], dp[i][j]); } } } printf("%lld\n", 2*dp[1] - sum ); } int main(void){ int n, i; //freopen("input.dat", "r", stdin); while(scanf("%d", &n), n){ for(i=1; i<=n; i++) scanf("%d", arr+i); func(n); } return 0; }
相关文章推荐
- 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) Game of Sum
- UVa 10891 Game of Sum(DP)
- UVA10891 Game of Sum
- UVA 10891 Game of Sum
- UVA 10891 - Game of Sum(区间dp)
- uva_10891 - Game of Sum( 博弈区间DP )
- UVA 10891 Game of Sum(区间DP)
- UVA - 10891 Game of Sum
- UVA 10891 Game of Sum
- Uva - 10891 - Game of Sum
- UVA 10891 Game of Sum(区间DP)
- UVA 10891 Game of Sum
- UVA-10891 Game of Sum
- UVA 10891 Game of Sum(区间DP)
- uva 10891 game of sum
- UVA 10891 Game of Sum