#include <iostream>
#include <cstdio>
using namespace std;
int a[100010];
int p[29];
int dp[1 << 20][20];
int b[29];
const int inf = 1500000000;
void checkmax(int & a, const int & b)
{
if(b > a) a = b;
}
int main()
{
int n ;
scanf("%d", &n);
for(int i = 0; i < n; i ++)
{
scanf("%d%d", &a[i], &p[i]);;
if(p[i] != -1)
{
b[p[i]] = 1;
}
}
for(int i = 0; i < (1 << n); i ++)
{
for(int j = 0; j < n; j ++)
{
dp[i][j] = -inf;
}
}
if(b[0])
{
for(int i = 0; i < n; i ++)
{
if(p[i] == 0)
{
dp[1 << i][i] = 0;
}
}
}
else
{
for(int i = 0; i < n; i ++)
{
if(p[i] == -1)
{
dp[1 << i][i] = 0;
}
}
}
for(int mask = 0; mask < (1 << n); mask ++)
{
int pos = 0;
for(int i = 0; i < n; i ++)
{
if(mask & (1 << i))
{
pos ++;
}
}
for(int end = 0; end < n; end ++)
{
if(dp[mask][end] != -inf)
{
for(int nxt = 0; nxt < n; nxt ++)
{
// `mask`閲岄潰鏈夊嚑涓?1$浣嶃€?
if( ! (mask & (1 << nxt)))
{
if(p[nxt] == pos || (b[pos] == 0 && p[nxt] == -1))
{
checkmax(dp[mask | (1 << nxt)][nxt], dp[mask][end] + a[end] * a[nxt]);
}
}
}
}
}
}
int ret = -inf;
for(int end = 0; end < n; end ++)
{
checkmax(ret, dp[(1 << n) - 1][end]);
}
printf("%d\n", ret);
return 0;
}
Sitting In The Line(百度之星初赛, 超能力Coding 4370)
最新推荐文章于 2024-08-08 15:12:59 发布
本文详细解析了百度之星竞赛中编号为4370的超能力Coding题目,深入探讨了如何运用算法和C++进行有效解决。通过分析数据结构的应用,揭示了解题的关键思路和技巧。
摘要由CSDN通过智能技术生成