首页 > 其他分享 >ZCMU-1051

ZCMU-1051

时间:2024-04-08 21:35:27浏览次数:27  
标签:分成 1051 int ZCMU 分开 dp


image
比较来说不太难其实,当然找到一定的公式这与前面的1033相识,都会用到f(i,j)=f(i-1,j)+f(i-1,j-1)

我们可以先从小部分看出来,一层可以整体或者两部分,在面对第i层看前面i-1层中分成j-1分和j分,但是又因为自己可以分成分开与不分开所以要用到三维数组,分别放置不分开与分开


我觉得比较难的点在于讨论i-1层与i层相连接的就是f(i,j)=g(f(i-1,j),f(i-1,j-1)),后面还要讨论一下j-2;对这样问题可以画出i-1的情况,与i层其余不看。以小看大。


#include<stdio.h>
#define mod 100000007
int dp[1002][2002][2]={0};
//对i列分成j部分的数组表示操作
//dp这类问题表示i中找j; 
void init(){
    int i,j,k;
    //其中又可以分成两部分,当前要不要分开
       
    dp[1][1][0]=1;
    dp[1][2][1]=1;
    //一行下分开后只能是2;
    for(i=2;i<1002;i++){
        dp[i][1][0]=1;
        //一个整体
         
        //因为分个数且每层两份,且题目也告诉了要2*n 
        for(j=2;j<2002;j++){
            dp[i][j][0] += dp[i-1][j][0];
            dp[i][j][0] %= mod;
            //表示在前面已经分号j分 
            dp[i][j][0] += dp[i-1][j-1][0];
            dp[i][j][0] %= mod;
            //分好j-1分,加上自己 
            dp[i][j][0] += 2*dp[i-1][j][1];
            dp[i][j][0] %= mod;
            //因为当前没分成两份,前一行分成两个,所以
            //i行怼上去后要乘以2; 
            dp[i][j][0] += dp[i-1][j-1][1];
            dp[i][j][0] %= mod;
            //虽然分成两行但只是j-1分 
            dp[i][j][1] += 2*dp[i-1][j-1][0];
            dp[i][j][1] %= mod;
            //当前分开不同怼上去 
            dp[i][j][1] += 2*dp[i-1][j-1][1];
            dp[i][j][1] %= mod;
            //一个怼(因为前面只有j-1) 
            dp[i][j][1] += dp[i-1][j][1];
            dp[i][j][1] %= mod;
            //因为要相对不会出现交叉 
            dp[i][j][1] += dp[i-1][j-2][0];
            dp[i][j][1] %= mod;
            //自己提供两种 
            dp[i][j][1] += dp[i-1][j-2][1];
            dp[i][j][1] %= mod;
        }
    }
}
 
int main(){
    int k,n,t;
    scanf("%d",&t);
    init();
    while(t--){
        scanf("%d%d",&n,&k);
        printf("%d\n",(dp[n][k][0]+dp[n][k][1])%mod);
    }
    return 0; 
}

借鉴观看代码

标签:分成,1051,int,ZCMU,分开,dp
From: https://www.cnblogs.com/hai-zei/p/18122639

相关文章

  • ZCMU-1033
    我觉得这位大佬说的已经很好了,可以直接看她的思路了;大佬思路但是她的代码没有考虑到1111的情况,代码思路这个是可以的很长且没有注释;#include<bits/stdc++.h>usingnamespacestd;longlongd[40][40];longlongc[40][40];longlonga[40];longlongx,y;intk,b;......
  • ZCMU操作系统课程实验 - 实验1-Linux的使用
    登录1.打开这个东西2. 在  文件->打开    中打卡机房里VMOS文件里的这个东东 3.然后依次操作下去好了,有红色的选项,我都是选的"Donothing"。完成后就会出现这样一个黑框框。4.让你登录。输入:root。密码:superuser    。注意输入密码的时候,密......
  • ZCMU-1038
    其实感觉不太难,读懂题意就行,我一开始没有仔细去读感觉就很懵。其题目意思就是一段字符串含有数字和'<'或者'>',一开始从左开始遍历,遇到'>'这类东西换方向,如果有多次遇到就删之前那一个;遇到数字就记下,并减去,一直减到0,就删掉思路:无非用一个int类型的数组存放数字打印个数,以及模拟......
  • ZCMU_1117
    /相当于看墙,投影之类的东西让我数多少个建筑物/解释感觉还不到位,以后再看看先强调这不是我原创的,只是加了注释。找到原作者后会加链接。以及改变布局#include<cstdlib>#include<cassert>#include<stack>usingnamespacestd;intmain(void){inti,n,h,coun......
  • Failed to connect to github.com port 443 after 21051 ms: Couldn't connect to ser
    使用git克隆远程仓库的代码,总是显示连接不上服务器,https和ssh都试了还是连不上。打开cmd去pinggithub.com也是显示连接超时,但是浏览器里面还是可以正常访问github。网上搜了一下,使用"ipconfig/flushdns"在cmd里面刷新一下本地的dns缓存,还是不行。最后找到一个方法,修改本地hosts文......
  • CF1051C Vasya and Big Integers 题解
    Problem-1051E-CodeforcesVasyaandBigIntegers-洛谷感谢女队提交记录推荐给我的一道题\(Orz\)首先\(O(n^2)\)的\(dp\)是simple的,如果你没看出来你可能是像我一样把题目看错了设\(dp_i\)表示考虑前\(i\)个的方案数,转移枚举长度后比较字典序。虽然看......
  • [题解] CF1051F The Shortest Statement
    TheShortestStatement给一张\(n\)个点\(m\)条边的无向连通图,保证\(m-n\le20\),\(q\)次询问求两个点间的最短路。\(n,m,q\le10^5\)。由于边数只比点数多20,所以如果我们建出这张图的一棵生成树,那么非树边至多有21条。那么现在两点之间的最短路就转化成了不......
  • CF1051G Distinctification
    Day\(3^3\)。未卡常拿到了最优解/cy。(2023/10/2)观察到\(3\)个比较关键的性质:操作具有可逆性,即一串操作序列可以立即撤销。当新插入一个\((a_i,b_i)\)时,必须连续对\(i\)进行\(1\)操作使得不存在\(j\neqi,a_j=a_i\)。当存在\(a_i=a_j+1\)时,可以花费\(b_j-b_i\)......
  • event 10513将禁止smon进程进行事务回滚
    Oracle参数之event10513发布时间:[2012-4-10]    来源:    作者:    点击:我们设置Oracle参数event10513将禁止smon进程进行事务回滚。在进行troubleshooting时,如shutdownabort后设置该速度可以加快数据库的open速度,注意加快速度的同时,也可能带来数据库一致性问......
  • CF1051G Distinctification题解
    link首先可以发现,题目给定的两种操作为我们提供了“反悔机制”,所以有:结论\(1\):即任何一个可以到达的局面都能到达最优解。利用这个结论,首先我们先去重。继续提炼性质,与相差不到\(1\)的数为基准\(+1\)与\(-1\)操作,将这个数的变化范围限制在了一个区间,并且这个区间的数能......