Removal题解

Removal

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

题意:N个数,删除M个数字,所有的数字都是小于K。
问你最后有几种子序列。
题解:首先数据范围一看可以DP,然后我们就要想表达式。
如下:DP[i][j]=dp[i-1][j-1]+dp[i-1][j];
翻译:当我加入第i个数的是时候,我删除j个数。等于符号后面的是由上一次的继承下来,首先我本次的第i个数删除,那么就还有j-1个数删除,也就是第i个数删了,之后是第i个数不删,删除前面的j个。
这样一来我们是不是就是把所有的子序列都搞出来,但是我们在这个过程中会有重复的计算,列如,1 2 3 2 4 3,当我们i=6,j=4,那么是不是删除324,和删除243会得到相同的子序列,这时候就是重复了,那么如何处理呢,首先我们每次把每个数都记录下来,判断这个数字在上次的那个位置出现,那么是不是就有这个k(上次出现此数的位置),使用上面的i,j,我们要想知道是否删除数字会不会重复,是不是应该 判断i-k和j的大,如果小于说明k-i的中间删除了都还有数字可以删除,对吧,这时候就有重复的了,dp[6][4]=dp[5][4]+dp[5][3]这是总的个数,之后我们如何减去重复的呢,是不是就应该回到上一个重复的数那里,i-k=6-3=3,中间加上第i个一共有三个数,是不是我们还要删除一个,怎么办,是不是就是删除K前面的,这个时候还有一个数需要删除,我们就是dp[3][1],对吧,为什么我们不能直接dp[6][4]-dp[3][1]呢,想想,dp[3][1]=dp[2][1]+dp[2][0],代表我前面的3是不删和删,然后dp[6][4]=dp[5][4]+dp[5][3],代表后面的3是不删还是删,这样一看我dp[6][4],是由前面的继承下来的 那么是不是应该减去dp[2][1];然后最后注意mod的不要溢出。

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define debug(x) cout << #x << ": " << x << endl;
#define debug1(x) cout<<"xxx"<<endl;
#define ll long long
#define ull unsigned long long
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#define mse(a,b) memset(a,b,sizeof a);
using namespace std;
const int maxx=1e6+100;
const int mod=1e9+7;
int ans[maxx];
int last[maxx];
int p[maxx];
int dp[maxx][15];
int main()
{
    fio;
    int n,m,k;
    while(cin>>n>>m>>k)
    {
         mse(last,0);
         mse(p,0);
        for(int i=1; i<=n; i++)
        {
            cin>>ans[i];
            p[i]=last[ans[i]];
            last[ans[i]]=i;
        }
        for(int i=0; i<=n; i++)
       {
       dp[i][i]=1;

       }
        for(int i=1; i<=n; i++)
        {
            dp[i][0]=1;
            for(int j=1; j<=min(i-1,m); j++)
            {
                dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod;///删除第i个数+不会删除第i个数
                if(p[i]!=0&&i-p[i]<=j)
                {
                    dp[i][j]=(dp[i][j]-dp[p[i]-1][j+p[i]-i]+mod)%mod;

            }
        }
        cout<<dp[n][m]<<endl;
    }
    return 0;
}
全部评论

相关推荐

头像
2025-12-02 21:34
中南大学 Java
我这边应该算是华为第一批开奖的了,还是要11月底才开,不过今年的流程整体比去年确实要开得早,这一点还是值得表扬的。然后华为也确实很有诚意,给我这样bg的硕鼠开了15a,并且base地还是在杭州,应该是buff拉满了,但凡其他公司开的没这个高,and对象没签上海,可能真选择成为华孝子了。虽然很有诱惑力,但是这个15a的offer里面确实还是有猫腻的:1.&nbsp;薪资构成是这样的,15a&nbsp;=&nbsp;(基本工资+绩效工资)*12&nbsp;+&nbsp;10w年终,虽然绩效工资hr说100%能拿满,年终大部分都能拿满,绩效工资能拿满我可能还选择相信,但10w年终还能拿满,这我就存疑了。反正看了一圈别家的公司报价都是报一般情况下能拿多少年终,比如美团0-6个月,就报3.5个月,但是华似乎是喜欢往最高了报,所以估计10w年终拿满应该也是极少数人。2.&nbsp;公积金只交5%,并且缴纳基数还只是按基本工资交的,这里看似每个月到手的钱变多了,但是总体算下来,可能一年比别家就少拿1-2w。3.&nbsp;月末周六要加班,可以选择调休或双倍加班费,并且平常应该也会加班,感觉不大会像hr说的124能8.30下班,35能5.30下班的,云计算bu强度应该还算比较好的,估计一般情况下9-9-5吧,但是不知道并入ict后会如何。4.&nbsp;还有相关的业务线,听说8,9月份云计算bu内部已经调整了一波,好像还要并入ict下面了,感觉未来的不确定性也比较大。5.&nbsp;华为的认可度应该比不过传统的互联网大厂,技术的前瞻性应该也比不过(个人看法)。6.&nbsp;培养和升职,感觉美团可能更有说法,毕竟见到过1年升L6的,甚至还有两年升L7的,对华为的了解相对较少,只知道华为可能相对稳定一些?毕竟4年一签?综上,还是决定放弃华,准备去团吧,自己选的路,希望不会后悔吧。
变形钢筋:这个薪资结构,年终奖是画大饼啊
OC/开奖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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