一本通1596动物园

1596:动物园

时间限制: 1000 ms         内存限制: 524288 KB

【题目描述】

原题来自:APIO 2007

新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物。如下图所示:

你是动物园的公关主管。你要做的是,让每个参观动物园的游客都尽可能高兴。今天有一群小朋友来到动物园参观,你希望能让他们在动物园度过一段美好的时光。但这并不是一件容易的事——有些小朋友喜欢某些动物,而有些小朋友则害怕某些动物。例如, Alex 喜欢可爱的猴子和考拉,而害怕拥有锋利牙齿的狮子。而 Polly 会因狮子有美丽的鬃毛而喜欢它,但害怕有臭味的考拉。

你可以选择将一些动物从围栏中移走以使得小朋友不会害怕。但你移走的动物也不能太多,否则留给小朋友们观赏的动物就所剩无几了。

每个小朋友站在大围栏圈的外面,可以看到连续的 5 个围栏。你得到了所有小朋友喜欢和害怕的动物信息。当下面两处情况之一发生时,小朋友就会高兴:

1、至少有一个他害怕的动物被移走;

2、至少有一个他喜欢的动物没被移走。

例如,考虑下图中的小朋友和动物:

假如你将围栏 4 和 12 的动物移走。Alex 和 Ka-Shu 将很高兴,因为至少有一个他们害怕的动物被移走了。这也会使 Chaitanya 高兴,因为他喜欢的围栏 6 和 8 中的动物都保留了。但是,Polly 和 Hwan 将不高兴,因为他们看不到任何他们喜欢的动物,而他们害怕的动物都还在。这种安排方式使得三个小朋友高兴。

现在换一种方法,如果你将围栏 4 和 6 中的动物移走,Alex 和 Polly 将很高兴,因为他们害怕的动物被移走了。Chaitanya 也会高兴,虽然他喜欢的动物 6 被移走了,他仍可以看到围栏 8 里面他喜欢的动物。同样的 Hwan 也会因可以看到自己喜欢的动物 12 而高兴。唯一不高兴的只有 Ka-Shu。

如果你只移走围栏 13 中的动物,Ka-Shu 将高兴,因为有一个他害怕的动物被移走了,Alex, Polly, Chaitanya 和 Hwan 也会高兴,因为他们都可以看到至少一个他们喜欢的动物。所以有 5 个小朋友会高兴。这种方法使得了最多的小朋友高兴。

【输入】

输入的第一行包含两个整数 N,C,用空格分隔。N 是围栏数,C 是小朋友的个数。围栏按照顺时针的方向编号为 1,2,3,…,N。

接下来的 C 行,每行描述一个小朋友的信息,以下面的形式给出:E F L X1 X2 XF Y1 Y2 YL

其中E 表示这个小朋友可以看到的第一个围栏的编号,换句话说,该小朋友可以看到的围栏为 E,E+1,E+2,E+3,E+4。注意,如果编号超过 N 将继续从 1 开始算。如:当 N=14,E=13时,这个小朋友可以看到的围栏为 13,14,1,213,14,1,2 和 33。

F 表示该小朋友害怕的动物数。L 表示该小朋友喜欢的动物数。

围栏 X1,X2,,XF 中包含该小朋友害怕的动物。围栏 Y1,Y2,,YL中包含该小朋友喜欢的动物。

X1,X2,,XF,Y1,Y2,,YL 是两两不同的整数,而且所表示的围栏都是该小朋友可以看到的。

【输出】

仅输出一个数,表示最多可以让多少个小朋友高兴。

小朋友已经按照他们可以看到的第一个围栏的编号从小到大的顺序排好了(这样最小的E 对应的小朋友排在第一个,最大的 E 对应的小朋友排在最后一个)。

注意可能有多于一个小朋友对应的 E 是相同的。

【输入样例】

14 5
2 1 2 4 2 6
3 1 1 6 4
6 1 2 9 6 8
8 1 1 9 12
12 3 0 12 13 2

【输出样例】

5

【提示】

样例说明 1

样例 1 给出了前面描述的示例情形。它使得所有小朋友(C=5)高兴。

样例输入 2

12 7
1 1 1 1 5
5 1 1 5 7
5 0 3 5 7 9
7 1 1 7 9
9 1 1 9 11
9 3 0 9 11 1
11 1 1 11 1

样例输出 2

6

样例说明 2

样例 2 给出了这样的情形,要使得所有小朋友(C=7)都高兴是不可能的。

数据范围与提示:

对于每一个测试点,如果你的答案正确,则该测试点得满分,否则得 00 分。

对于全部数据,10N104,1C5×104,1EN

 

sol:首先由题解可知这是一道状压dp好题。

令dp[i][j]表示以i为开头的5个动物以状态为j时最多能让多少小朋友快乐(需要在每个小朋友的位置E上预处理出使E,E+1,~,E+5状态为j时的快乐人数),然后先暴力枚举(n-3~n的状态)之后n*32转移就可以了

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-');
        ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48);
        ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');
        return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
inline void writeln(ll x)
{
    write(x);
    putchar('\n');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) writeln(x)
const int N=10005,B=35,inf=0x3f3f3f3f;
int n,C,Gongx[N][B],dp[N][B];
int main()
{
    int i,j,k;
    R(n); R(C);
    for(i=1;i<=C;i++)
    {
        int Haip=0,Xih=0,E,F,L;
        R(E); R(F); R(L);
        for(j=1;j<=F;j++)
        {
            int x=read();
            Haip|=(1<<((x-E+n)%n));
        }
        for(j=1;j<=L;j++)
        {
            int x=read();
            Xih|=(1<<((x-E+n)%n));
        }
        for(j=0;j<32;j++)
        {
            Gongx[E][j]+=(((j^31)&Haip)||(Xih&j))?1:0;
        }
    }
    int ans=0;
    for(i=0;i<16;i++)
    {
        for(j=0;j<32;j++) dp[0][j]=-inf;
        dp[0][i<<1]=dp[0][(i<<1)|1]=0;
        for(j=1;j<=n;j++)
        {
            for(k=0;k<32;k++)
            {
                dp[j][k]=max(dp[j-1][(k&15)<<1],dp[j-1][((k&15)<<1)|1])+Gongx[j][k];
            }
        }
        ans=max(ans,max(dp[n][i<<1],dp[n][(i<<1)|1]));
    }
    Wl(ans);
    return 0;
}
/*
input
14 5
2 1 2 4 2 6
3 1 1 6 4
6 1 2 9 6 8
8 1 1 9 12
12 3 0 12 13 2
output
5

input
12 7
1 1 1 1 5
5 1 1 5 7
5 0 3 5 7 9
7 1 1 7 9
9 1 1 9 11
9 3 0 9 11 1
11 1 1 11 1
output
6
*/
View Code

转载于:https://www.cnblogs.com/gaojunonly1/p/10371782.html

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,过量子行为模型增强全局搜索能力。 QPSO过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值