E(2211): Assemble(类状压dp)

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的产品

这题呢,处理方法就是只需要把每一行的最大值和最小值保存并dp一下就可以了

#include<cstdio>
#include<algorithm> 
using namespace std;
typedef long long ll;
int d[11][2];
int cnt[11]={1,2,4,8,16,32,64,128,256,512,1024};
int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
	{
		int mi=11,mx=-11;
		for(int j=1;j<=k;j++)
		{
			int x;
			scanf("%d",&x);
			mi=min(mi,x);
			mx=max(mx,x);
		}
		d[i][0]=mi,d[i][1]=mx;
	}
	
	ll mxx=-0x3f3f3f3f;
	for(int i=0;i<cnt[n];i++)
	{
		ll ans=1;
		for(int j=0;j<n;j++)
		{
			if((i>>j)&1) ans*=1ll*d[j][0];
			else ans*=1ll*d[j][1];
		}
		mxx=max(mxx,ans);
	}
	printf("%lld\n",mxx);
 } 

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/86529117