UVa 10003 Cutting Sticks 解题源码
2012-12-28 22:19
471 查看
题目地址:http://uva.onlinejudge.org/external/100/10003.html
采用动态规划记忆化搜索实现,采用results二维数组存储中间计算结果
/*
* 10003.cc
*
* Created on: Dec 28, 2012
* Author: guixl
*/
#include <stdio.h>
#include <string.h>
#define min(a, b) (a) < (b) ? (a) : (b)
int places[50];
int results[50][50];
int dp(int start, int stop) {
if (start+1 == stop)
return 0;
else if (results[start][stop])
return results[start][stop];
int sum = 1<<30;
for (int i=start+1; i<stop; i++) {
sum = min(sum, dp(start, i) + dp(i, stop));
}
results[start][stop] = sum + places[stop] - places[start];
return results[start][stop];
}
int main(int argc, char** argv) {
int length, number;
while (true) {
scanf("%d", &length);
if (!length)
break;
scanf("%d", &number);
memset(places, 0, sizeof(places));
for (int i=0; i<50; i++)
memset(results[i], 0, sizeof(results[i]));
for (int i=1; i<=number; i++) {
scanf("%d", places+i);
}
places[number+1] = length;
printf("The minimum cutting is %d.\n", dp(0, number+1));
}
return 0;
}
经过测试,采用递推法实现上述代码后,程序运行时间为记忆化搜索的1/4,具体代码如下:
#include <stdio.h>
#include <string.h>
#define min(a, b) (a) < (b) ? (a) : (b)
int places[50];
int results[50][50];
int main(int argc, char** argv) {
int length, number;
while (true) {
scanf("%d", &length);
if (!length)
break;
scanf("%d", &number);
memset(places, 0, sizeof(places));
int int_max = 1<<30;
for (int i=0; i<50; i++)
for (int j=0; j<50; j++)
results[i][j] = int_max;
for (int i=1; i<=number; i++) {
scanf("%d", places+i);
results[i-1][i] = 0;
}
places[number+1] = length;
results[number][number+1] = 0;
//递推法实现
for (int i=2; i<=number+1; i++)
for (int j=1; j<i; j++) {
for (int k=0; k+i <=number+1; k++) {
results[k][k+i] = min(results[k][k+i], results[k][k+j] + results[k+j][k+i] + places[k+i]-places[k]);
}
}
printf("The minimum cutting is %d.\n", results[0][number+1]);
}
return 0;
}
运行时间比较:
0.448为记忆化搜索实现方式程序运行时间,0.12为递推法运算时间。
采用动态规划记忆化搜索实现,采用results二维数组存储中间计算结果
/*
* 10003.cc
*
* Created on: Dec 28, 2012
* Author: guixl
*/
#include <stdio.h>
#include <string.h>
#define min(a, b) (a) < (b) ? (a) : (b)
int places[50];
int results[50][50];
int dp(int start, int stop) {
if (start+1 == stop)
return 0;
else if (results[start][stop])
return results[start][stop];
int sum = 1<<30;
for (int i=start+1; i<stop; i++) {
sum = min(sum, dp(start, i) + dp(i, stop));
}
results[start][stop] = sum + places[stop] - places[start];
return results[start][stop];
}
int main(int argc, char** argv) {
int length, number;
while (true) {
scanf("%d", &length);
if (!length)
break;
scanf("%d", &number);
memset(places, 0, sizeof(places));
for (int i=0; i<50; i++)
memset(results[i], 0, sizeof(results[i]));
for (int i=1; i<=number; i++) {
scanf("%d", places+i);
}
places[number+1] = length;
printf("The minimum cutting is %d.\n", dp(0, number+1));
}
return 0;
}
经过测试,采用递推法实现上述代码后,程序运行时间为记忆化搜索的1/4,具体代码如下:
#include <stdio.h>
#include <string.h>
#define min(a, b) (a) < (b) ? (a) : (b)
int places[50];
int results[50][50];
int main(int argc, char** argv) {
int length, number;
while (true) {
scanf("%d", &length);
if (!length)
break;
scanf("%d", &number);
memset(places, 0, sizeof(places));
int int_max = 1<<30;
for (int i=0; i<50; i++)
for (int j=0; j<50; j++)
results[i][j] = int_max;
for (int i=1; i<=number; i++) {
scanf("%d", places+i);
results[i-1][i] = 0;
}
places[number+1] = length;
results[number][number+1] = 0;
//递推法实现
for (int i=2; i<=number+1; i++)
for (int j=1; j<i; j++) {
for (int k=0; k+i <=number+1; k++) {
results[k][k+i] = min(results[k][k+i], results[k][k+j] + results[k+j][k+i] + places[k+i]-places[k]);
}
}
printf("The minimum cutting is %d.\n", results[0][number+1]);
}
return 0;
}
运行时间比较:
11086859 | 10003 | Cutting Sticks | Accepted | C++ | 0.120 | 2012-12-29 13:48:01 |
11083238 | 10003 | Cutting Sticks | Accepted | C++ | 0.448 | 2012-12-28 14:17:33 |
相关文章推荐
- 【解题报告】uva10003_Cutting Sticks(切割木棍, dp)
- uva10003 Cutting Sticks解题报告
- UVA 10003 - Cutting Sticks
- UVA 10003 - Cutting Sticks (区间DP)
- uva 10003 - Cutting Sticks
- UVA 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- uva 10003 cutting sticks
- uva10003 - Cutting Sticks(区间dp)
- 例题9-9 UVA 10003 Cutting Sticks 切木棍(区间dp)
- uva_10003 Cutting Sticks
- UVa 10003 Cutting Sticks (DP)
- UVa 10003 Cutting Sticks(区间DP)
- 例题9-9 UVa10003 Cutting Sticks(DP:矩阵链乘)
- 区间dp uva 10003 - Cutting Sticks
- UVA 10003 Cutting Sticks
- uva 10003 Cutting Sticks 【区间dp】
- uva 10003 Cutting Sticks 简单区间dp
- UVA 10003 Cutting Sticks
- uva 10003 Cutting Sticks