当时做这个题的时候,写了这个看起来很暴力的代码:
//约定:主菜放在第一层,副菜第二层,饮料第三层,甜品第四层。每种dislike相当于上一层和下一层产生冲突
//变量:dislike[i][j]:第i层的菜品j和下一层的哪些菜品冲突。mincost[i][j]:第i层的菜品j所能选取的最小的代价,inf为无法选择
int cal(int layer,int num,priority_queue<node> q)//计算第layer个种类第num种菜品所能和下一层选择出的最小的总代价
{
while(dislike[layer][num][q.top().id] && !q.empty())//只要有冲突就弹出。q为按菜品代价排血的小根堆
q.pop();
if(q.empty())
return inf;
return q.top().value;
}
for (int i = 1; i <= n[4];i++)//甜品层的初始化:此时mincost就等于当前的价格value
min_cost[4][i] = value[4][i];
for (int i = 3; i >= 1; i--)//从后往前遍历
{
priority_queue<node> q;
for (int j = 1; j <= n[i + 1]; j++)//塞进去下一层待匹配的菜品及价格
q.push((node){j,min_cost[i + 1][j]});
for (int j = 1; j <= n[i]; j++)//逐一计算
{
min_cost[i][j] += cal(i, j, q);
min_cost[i][j] += value[i][j];
}
}
个人感觉这个复杂度至多只有O(n+m),即线性的,算上堆的操作也就O((n+m)logn),但是却T掉了,这是什么原因?