CSU 2211 Assemble 思维 dp

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2211

Description

Xrdog准备组装一台属于他自己的电脑。

具体来说是这样子的,组装这台电脑需要n个部件(显卡,CPU,硬盘....),每种部件均有k个品牌的产品,不同的产品会有一个性能值来衡量它的性能。Xrdog现在要选择n个产品来组装成他的电脑,这n个产品分别是不同的部件(换言之就是要从每种部件中选择一个),我们定义这台电脑的最终性能值为选择的n个产品的性能值的乘积。

现在Xrdog想最大化他的电脑的性能值,你能帮助一下他吗?

Input

第一行两个正整数整数n,k(n<10,k<10) 接下来n行,每行k个整数,第i行表示的是第i-1个部件的k个品牌的产品的性能值。(|性能值|<10)

Output

输出一个整数,表示电脑的性能值的最大可能值

Sample Input

3 2
2 1
1 2
2 -2

Sample Output

8

Hint

2 * 2 * 2 = 8 即是在每种部件中均选择了性能值为2的产品

Source

思路:假设MAX、MIN是我们当前所能得到的最大值和最小值,这一步可选的最大值是a,最小值是b,那么下一步的解一定是:MAX=max(MAX*a,MAX*b,MIN*a,MIN*b),MIN=min(MAX*a,MAX*b,MIN*a,MIN*b);这就是转移方程,为什么是这样呢?分一下MAX、MIN、a、b的正负就知道了。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

int a[15][15];
int n,m;

int main()
{
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			scanf("%d",&a[i][j]);
	for(int i=0;i<n;i++)
		sort(a[i],a[i]+m);
	int MAX=a[0][m-1];
	int MIN=a[0][0];
	int t1,t2,t3,t4;
	for(int i=1;i<n;i++)
	{
		t1=MAX*a[i][m-1];//最大*最大
		t2=MAX*a[i][0];//最大*最小
		t3=MIN*a[i][m-1];//最小*最大
		t4=MIN*a[i][0];//最小*最小
		MAX=max(max(t1,t2),max(t3,t4));
		MIN=min(min(t1,t2),min(t3,t4));
	}
	printf("%d\n",MAX);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值