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);
}