关于这种做法的时间复杂度
查看原帖
关于这种做法的时间复杂度
80026
walk_alone楼主2021/2/17 17:24

当时做这个题的时候,写了这个看起来很暴力的代码:

//约定:主菜放在第一层,副菜第二层,饮料第三层,甜品第四层。每种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),即线性的,算上堆的操作也就O((n+m)logn)O((n+m)logn),但是却T掉了,这是什么原因?

2021/2/17 17:24
加载中...