首页 > 其他分享 >iwtgm-20

iwtgm-20

时间:2023-11-12 22:56:52浏览次数:37  
标签:20 iwtgm ans 联通 对角 步数 dp mod

题目链接
dp
确实没想到这种递推方式,一直绕在把整个网格分成k块,又要满足颜色不同,实在解不出来
dp的设置状态不是没想过,像这样的设置的确超出我的水平了

现在详细讲讲
只有两行,若两行的颜色块状态已知,我们是可以判断什么情况联通块会+1,什么情况是不变的,我们进行枚举即可
f[i][j][type]表示第i列,已经有j个联通块,type是上下颜色块的状态
这里我们设置0为BW,1为BB,2为WW,3为WB
来个例子:
第一列是B 第二列是B 那么我们的联通块数是不变的
W。 W 因为B与前一列的B属于同一个联通块,W同理

第一列是B 第二列是W 那么我们的联通块数+2
W。 B。 因为W不能属于前面任何一个联通块,联通块数+1,B同理

得到状态转移方程:
f[i][j][0]=f[i-1][j][0]+f[i-1][j-1][1]+f[i-1][j-1][2]+f[i-1][j-2][3];
f[i][j][1]=f[i-1][j][0]+f[i-1][j][1]+f[i-1][j-1][2]+f[i-1][j][3];
f[i][j][2]=f[i-1][j][0]+f[i-1][j-1][1]+f[i-1][j][2]+f[i-1][j][3];
f[i][j][3]=f[i-1][j-2][0]+f[i-1][j-1][1]+f[i-1][j-1][2]+f[i-1][j][3];

注意初始化第一列,第一列4种摆放方式都有可能

int n,k;
int dp[1010][2010][5];
const int mod=998244353;
void solve() {
    cin>>n>>k;
    dp[1][1][1]=1;dp[1][1][2]=1;dp[1][2][0]=1;dp[1][2][3]=1;
    for(int i=2;i<=n;i++){
        for(int j=1;j<=k;j++){
            dp[i][j][0]=(dp[i][j][0]+dp[i-1][j][0])%mod;dp[i][j][0]=(dp[i][j][0]+dp[i-1][j-1][1])%mod;dp[i][j][0]=(dp[i][j][0]+dp[i-1][j-1][2])%mod;if(j>=2)dp[i][j][0]=(dp[i][j][0]+dp[i-1][j-2][3])%mod;
            dp[i][j][1]=(dp[i][j][1]+dp[i-1][j][0])%mod;dp[i][j][1]=(dp[i][j][1]+dp[i-1][j][1])%mod;dp[i][j][1]=(dp[i][j][1]+dp[i-1][j-1][2])%mod;dp[i][j][1]=(dp[i][j][1]+dp[i-1][j][3])%mod;
            dp[i][j][2]=(dp[i][j][2]+dp[i-1][j][0])%mod;dp[i][j][2]=(dp[i][j][2]+dp[i-1][j-1][1])%mod;dp[i][j][2]=(dp[i][j][2]+dp[i-1][j][2])%mod;dp[i][j][2]=(dp[i][j][2]+dp[i-1][j][3])%mod;
            if(j>=2)dp[i][j][3]=(dp[i][j][3]+dp[i-1][j-2][0])%mod;dp[i][j][3]=(dp[i][j][3]+dp[i-1][j-1][1])%mod;dp[i][j][3]=(dp[i][j][3]+dp[i-1][j-1][2])%mod;dp[i][j][3]=(dp[i][j][3]+dp[i-1][j][3])%mod;
        }
    }
    ll ans=0;
    ans=(ans+dp[n][k][0])%mod;
    ans=(ans+dp[n][k][1])%mod;
    ans=(ans+dp[n][k][2])%mod;
    ans=(ans+dp[n][k][3])%mod;
    cout<<ans;
}

B.

又是一道从一开始就想错的题
因为后来才发现比如先往右上再往右下等价于往右移动两格,也就是用对角的方式走了水平或垂直的路,然后就去想把水平或竖直的路径变成对角的,认为直接走真正对角的不会最优
没想到就是先走真正的对角,然后再考虑把水平或竖直变成对角更为好做,服了

这个图中,我们可以把对角换成一个水平和一个竖直,也可以把一个水平和一个竖直换成一个对角

从原点到目的地需要的最小步数是max(a,b) (连这个都忘了我服了)
若k<max(a,b),那么就输出-1
考虑合法情况的最优解:
先走真正的对角到达b限定的高度
a和b表示终点坐标,设a为较大数

如果(a-b)%2==0,那么我们把用对角的方式走水平线(方式为必须两个水平线换两个对角)

第一次走到终点后,若剩余步数是偶数,那么用对角的方式从终点来回跳
若剩余步数是奇数,要求最后要走到目的地,那么就把前面的一个对角换成一条水平线和一条竖直线,此时对角的贡献-1,可以到达目的地

如果(a-b)%2==1,
那么必须要消耗一个步数走平路以到达目的地

第一次走到终点后,若剩余步数是偶数,那么以对角的方式在终点来回跳
若是奇数,把平路的那条改成对角,再花费一个步数从对角走到终点,对角+1

代码:

void solve() {
    ll n,m,k;cin>>n>>m>>k;
    if(n>m)swap(n,m);//n为较小数
    ll res=max(n,m);//从原点到终点所需最小步数
    if(res>k){//步数不够
        cout<<-1<<endl;return ;
    }
    ll ans=n;//先把真正的对角走完,此时到达b限定的高度
    ll x=k-res;//剩余的步数
    ll y=abs(n-m);//多出来的那段路
    if(y&1)ans+=y-1;//花费1个步数走平路,其余都走对角(是偶数)
    else ans+=y;//是偶数,全走对角
    if(x&1)ans+=x-1;//先把偶数个来回跳,剩下一个后面处理
    else ans+=x;//偶数直接来回跳完
    if(x&1&&y&1)ans++;//把平路花费的那一条变成对角,多出来的这一步从对角走到终点
    else if(y%2==0&&x&1)ans--;//把原来的一个对角改成平路,再加上剩余的1个也走平路,等价于原来的那个对角
    cout<<ans<<endl;
}

标签:20,iwtgm,ans,联通,对角,步数,dp,mod
From: https://www.cnblogs.com/wwww-/p/17828081.html

相关文章

  • 每日总结2023年11月12日
    今天跟着网上小老师的步骤在做一个springboot+vue的项目,但是在配置tomcat端口的时候遇到一个问题,就是在application.yml里面配置的8081端口号并没有生效,如下图 相信不少明眼的小伙伴已经看出我的问题所在了,没错,应该是server而不是service,而且还有一个重要的判断依据就是port:后......
  • 20231112 K8S部署MetalLB以及测试应用
    环境配置3节点的K8S1+2配置[root@rocky9-1dashboard]#kubectlgetnode-owideNAMESTATUSROLESAGEVERSIONINTERNAL-IPEXTERNAL-IPOS-IMAGEKERNEL-VERSIONCONTAINER-RUNTIMErocky9-1R......
  • 2023-2024-1 20231425《计算机基础与程序设计》第七周学习总结
    2023-2024-120231425《计算机基础与程序设计》第七周学习总结作业信息所属课程2023-2024-1-计算机基础与程序设计作业要求在哪里2023-2024-1计算机基础与程序设计第六周作业作业目标学习教材《计算机科学概论》第8章《C语言程序设计》第6章并完成云班课......
  • 2023-2024-1 20231427 田泽航 《计算机基础与程序设计》第七周学习总结
    学期(如2023-2024-1)学号(如:20231300)《计算机基础与程序设计》第X周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.ht......
  • 2023-2024-1 20231318《计算机基础与程序设计》第7周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第七周作业这个作业的目标1.学习《计算机科学概论》第8章并完成云班课测试;2.学习《C语言程序设计》第6章并完成云班课测试。作业正文2023-2......
  • 2023.11.12 近期杂题
    CF1657E发现充要条件即为对于每个点\(i\),其与\(1\)的连边为其所有连边中最小的。这\(dp_{i,j}\)表示处理了\(i\)个点,当前与\(1\)连的最大的边长度是\(j\)。\(dp_{i,j}=\sum_{t=1}^{i-1}(\sum_{x=0}^{j-1}dp_{t,x})\timesC_{n-t}^{i-t}\times(k-j+1)^{(i+t-3)(i-t)/......
  • 【2023-11-04】连岳摘抄
    23:59一个人如果达到相当年龄,还不失赤子之心,经风吹雨打,方寸间还能诗意盎然,他是得天独厚,他是诗人。                                                 ——梁实秋如果......
  • 【2023-11-03】灵感宣泄
    20:00鲁班锁,它就像和平一样,拆开容易组装难,破坏容易重建难。                                                 ——张军近期,因为自己的一个研发产品概念,让自己兴奋了......
  • [NOIP2022] 比赛 - 总结
    [NOIP2022]比赛0.问题转化首先需要转化为区间历史和问题。具体上来讲,就是将询问离线后,扫描线维护对于\(r\)来说,每一个\(l\)的\(\sum_{i=l}^{r}(\max_{j=l}^{i}a_j\\cdot\\max_{j=l}^{i}b_j)\)那么答案就是区间和。1.构造信息与标记接下来就是如何维护区间历史和。......
  • 2023-2024-1 20231418 《计算机基础与程序设计》第七周周总结
    2023-2024-120231418《计算机基础与程序设计》第七周总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第七周作业这个作业的目标数组与链表、基于数组和基于链......