您的位置:首页 > 其它

UVA 10891 Game of Sum

2014-06-16 20:52 281 查看
递归式的DP加上状态查重,复杂度为n*n*n,书上还有n*n复杂度的算法,先把低效的实现代码粘上来,随后再实现高效的。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm uva