hdu.5542-The Battle of Chibi

The Battle of Chibi

https://ac.nowcoder.com/acm/problem/51193

The Battle of Chibi

  • 分析

    这题不用优化?
    状态设计:设f [ i ] [ j ] :长度为 i ,以 a [ j ] 为结尾的严格上升子序列
    图片说明
    如果要优化的用树状数组+离散化,可以减少一重循环

  • 代码(普通)

int T;scanf("%d",&T);
    for (int u=1;u<=T;u++)
    {
        memset(f,0,sizeof(f));
        scanf("%lld%lld",&n,&m);
        for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
        a[0]=-1e9;f[0][0]=1;
        for (int i=1;i<=m;i++)//长度 
            for (int k=i;k<=n;k++)//当前 
                for (int j=0;j<k;j++)//上一个 
                {
                    if(a[k]>a[j])
                        f[i][k]=(f[i][k]+f[i-1][j])%mod;
                }

        ll ans=0;
        for (int i=1;i<=n;i++) ans=(ans+f[m][i])%mod;

        printf("Case #%d: %lld\n",u,ans);
    }
  • 代码(优化)

//#pragma GCC optimize(3,"inline","Ofast","fast-math","no-stack-protector","unroll-loops")
//#pragma GCC target("sse","sse2","sse3","sse4","avx","avx2","popcnt")

/*
(写点什么吧...)
*/
#include<bits/stdc++.h>

#define R register
#define ll long long
#define inf INT_MAX

using namespace std;

const int N=1e3+10;
const ll mod=1e9+7;

ll n,m,cnt;
ll a[N],f[N][N],b[N],s[N];

inline int lowbit(int x)
{
    return x&(-x);
}

inline void add(ll x,ll z)
{
    while(x<=n+1)
    {
        s[x]+=z;
        s[x]%=mod;
        x+=lowbit(x);
    }
}

inline ll ask(ll x)
{
    ll ret=0;
    while(x)
    {
        ret+=s[x];
        ret%=mod;
        x-=lowbit(x);
    }

    return ret;
}

int main()
{
    int T;scanf("%d",&T);
    for (int u=1;u<=T;u++)
    {
        scanf("%lld%lld",&n,&m);
        for (int i=1;i<=n;i++)
            scanf("%lld",&a[i]),b[i]=a[i];
        sort(b+1,b+n+1);

        int cnt=unique(b+1,b+n+1)-b-1;
        for (int i=1;i<=n;i++)
            a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;

        memset(f,0,sizeof(f));
        f[0][0]=1;
        for (int i=1;i<=m;i++)
        {
            memset(s,0,sizeof(s));
            add(1,f[i-1][0]);
            for (int k=1;k<=n;k++)
            {
                f[i][k]=ask(a[k]);
                add(a[k]+1,f[i-1][k]);
            }

        }

        ll ans=0;
        for (int i=1;i<=n;i++) ans=(ans+f[m][i])%mod;

        printf("Case #%d: %lld\n",u,ans);
    }

    return 0;
}
DP 文章被收录于专栏

balabala

全部评论

相关推荐

2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
2025-12-27 22:14
门头沟学院 Java
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务