POJ 1651 Multiplication Puzzle

题目大意:

        乘法谜题是一种用卡片玩的游戏,卡片按照一定顺序排列成一排,每张卡片上都有一个整数(范围是[1, 100]),游戏中玩家需要不断从序列中抽取就卡片,一次只能抽取一张,每抽取一张就要累加一次积分,此次积分等于抽出卡片上的数字和该卡片左右相邻卡片上的数字的乘积(头尾两张卡片不能抽,也就是说抽到最后就为剩下头尾两张卡片),现要求最后的总积分要最小,最小者获胜。

        现只有一个测例,测例中给出卡片的数量n(3 ≤ n ≤ 100),接下来从左至右给出每张卡片上的数字,要求输出最终的最小总积分。

题目链接

注释代码:

/*
 * Problem ID : POJ 1651 Multiplication Puzzle
 * Author     : Lirx.t.Una
 * Language   : C
 * Run Time   : 0 ms
 * Run Memory : 160 KB
*/

#include <stdio.h>

//得分的无穷大
//大于 100 × 100 × 100 × ( 100 - 2 )
#define	INF		98000001

//maximum number of cards
//卡片的最大数量
#define	MAXCARDN		100

#define	MIN(x,y)	( (x) < (y) ? (x) : (y) )

int		c[MAXCARDN];//card[i]表示第i张卡片的数值,下标从0开始
//dp[i][j]表示从第i号卡片到第j号卡片之间进行题目要求规则抽取
//所得到的最大分数
int		dp[MAXCARDN][MAXCARDN];

int
main() {

	int		n;//卡片数量
	int		i, j, k;//计数变量
	int		g;//间隔

	int		tmp;//临时变量

	scanf("%d", &n);

	for ( i = 0; i < n; i++ )
		scanf("%d", c + i);

    //对于间隔为1的dp值由于是全局静态变量的缘故都初始化为0了
    //表示间隔为1的区间无法抽取卡片(无中间卡片,区间端点的两张卡片式不能抽取的)
	for ( g = 2; g < n; g++ )//从间隔为2开始扫描
		for ( i = 0, j = i + g; j < n; i++, j++ ) {
            //所有[i, j]间隔都是g
		
			dp[i][j] = INF;//先初始化为无穷
			for ( k = i + 1; k < j; k++ ) {//再[i, j]区间内逐个设置断点k
			
                //抽取方法就是先抽完左半边再抽完右半边
                //最后就只剩下i、j、k三张牌了
                //下式就是转移方程了,不用担心间隔为1的区间,因为已经初始化为0了
				tmp 	 = dp[i][k] + dp[k][j] + c[i] * c[k] * c[j];
				dp[i][j] = MIN( dp[i][j], tmp );
			}
		}

	printf("%d\n", dp[0][n - 1]);

	return 0;
}

无注释代码:

#include <stdio.h>

#define	INF		98000001

#define	MAXCARDN		100

#define	MIN(x,y)	( (x) < (y) ? (x) : (y) )

int		c[MAXCARDN];
int		dp[MAXCARDN][MAXCARDN];

int
main() {

	int		n;
	int		i, j, k;
	int		g;

	int		tmp;

	scanf("%d", &n);

	for ( i = 0; i < n; i++ )
		scanf("%d", c + i);

	for ( g = 2; g < n; g++ )
		for ( i = 0, j = i + g; j < n; i++, j++ ) {
		
			dp[i][j] = INF;
			for ( k = i + 1; k < j; k++ ) {
			
				tmp 	 = dp[i][k] + dp[k][j] + c[i] * c[k] * c[j];
				dp[i][j] = MIN( dp[i][j], tmp );
			}
		}

	printf("%d\n", dp[0][n - 1]);

	return 0;
}

单词解释:

puzzle:n, 谜题

product:n, 乘积

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值