您的位置:首页 > 其它

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;

}

运行时间比较:

1108685910003Cutting SticksAcceptedC++0.1202012-12-29 13:48:01
1108323810003Cutting SticksAcceptedC++0.4482012-12-28 14:17:33
0.448为记忆化搜索实现方式程序运行时间,0.12为递推法运算时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: