首页 > 其他分享 >做题记录整理dp11 P4158 [SCOI2009]粉刷匠(2022/9/23)

做题记录整理dp11 P4158 [SCOI2009]粉刷匠(2022/9/23)

时间:2022-09-23 20:57:29浏览次数:86  
标签:不涂 max 23 粉刷 SCOI2009 2022 P4158 dp

P4158 [SCOI2009]粉刷匠
事实上前半个小时我甚至没想用dp做。。。
感觉这道题难度标高了(跟那个想让我测出题人的码的题相比)
首先可以发现每一行之间都是独立的,所以先考虑把每一行的刷i次的最大正确数整出来
然后就可以想到dp(事实上我想了很久怎么贪心)

本蒟蒻不会什么太高深的做法,就猛写了一发毒瘤dp,莫名其妙过了

dp[i][j][k][0/1/2]表示第i行第j列一共粉刷了k次,0/1/2分别表示当前格子没有涂色/涂了错的颜色/涂了对的颜色, 然后我们考虑逐格转移:

当j=1也就是出于每行的第一个位置时,我们要考虑上一行的最后一个位置, 即

dp[i][j][k][0]=max(dp[i-1][m][k][1],max(dp[i-1][m][k][2],dp[i-1][m][k][0]));

dp[i][j][k][1]=max(dp[i-1][m][k-1][2],max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0]));

dp[i][j][k][2]=max(dp[i-1][m][k-1][2],max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0]))+1;
其余位置要考虑这个格子颜色是否和前一个格子的颜色相等,如果相等,就有

dp[i][j][k][2]=dp[i][j-1][k][2]+1;
可以直接接上

dp[i][j][k][1]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0]);
前面涂错或不涂

dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k][1]);
前面涂错或不涂 如果不相等,

dp[i][j][k][2]=max(dp[i][j-1][k-1][2],max(dp[i][j-1][k][1],dp[i][j-1][k-1][0]))+1;
前面可能有三种情况

dp[i][j][k][1]=max(dp[i][j-1][k][2],dp[i][j-1][k-1][0]);
涂对或不涂       

dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k][2]);
涂对或不涂
可以用滚动数组压掉第一维,这样空间复杂度是O(nT),时间复杂度是O(nmT),还是可以过的

参考这位大佬的题解,不知道为什么他的博客里是出错

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int dp[2501][2505][3];
int a[5500];
int ans[5005];
int n,m,k;
int main()
{
	scanf("%d%d%d\n",&n,&m,&k);
	for1(l,1,n)
	{
		for1(i,1,m)
          	scanf("%1d",&a[i]);
		for1(i,1,m)
		    for1(j,1,k) 
		        dp[i][j][0]=0,dp[i][j][1]=0;
		        
		for1(i,1,m)
		{
			for1(j,1,i)
			{
			    dp[i][j][a[i]]=dp[i-1][j][a[i]]+1;
			    dp[i][j][!a[i]]=dp[i-1][j][!a[i]];
			    
			    dp[i][j][a[i]]=max(dp[i][j][a[i]],max(dp[i-1][j-1][0],dp[i-1][j-1][1])+1);
			    dp[i][j][!a[i]]=max(dp[i][j][!a[i]],max(dp[i-1][j-1][0],dp[i-1][j-1][1]));
			}
		}
		for(int i=k;i>=1;i--)//背包 
			for1(j,0,min(m,i))
				ans[i]=max(ans[i],ans[i-j]+max(dp[m][j][0],dp[m][j][1]));
	}
	cout<<ans[k];
	return 0;
}
		

标签:不涂,max,23,粉刷,SCOI2009,2022,P4158,dp
From: https://www.cnblogs.com/yyx525jia/p/16724198.html

相关文章

  • OpenGL+VS2022环境配置
    OpenGL+VS2022环境配置网上博客写的都什么玩意儿,配了半天终于配出来了。。。简单的很!新建文件夹新建一个文件夹,你可以命名为OpenGL,当然你也可以选你喜欢的名字。我这里......
  • 做题记录整理dp9 P1758 [NOI2009] 管道取珠(2022/9/23)
    P1758[NOI2009]管道取珠这道题的难点就在于赋予ai的平方和一个具体的含义,我们可以想到(其实要不是上课听了根本想不到)ai的平方和其实就是两个管道取珠游戏一起玩,然后取......
  • 做题记录整理dp810 P2254 [NOI2005] 瑰丽华尔兹(2022/9/23)
    P2254[NOI2005]瑰丽华尔兹题解这题的难点在与dp的递推方程的书写如果写对了递推方程,想到单调队列优化是很自然的(然而我想到了不会打)还有递推方程的具体代码实现也挺......
  • 做题记录整理dp8 P5665 [CSP-S2019] 划分(2022/9/23)
    P5665[CSP-S2019]划分这题其实并不是题单的第八题,但我现在一做完题目马上就想来(测出题人的码)整理题目因为这题是真的恶心首先朴素的n三次方dp,枚举上一个端点,以及上上......
  • 25th-27th 2022/7/28,2022/7/29,2022/7/30 模拟赛总结15-17
    首先这次是补,因为有个垃圾将我的总结删了它的名字不配出现在我的总结中这三次其实都不算好主要问题是没睡好,读题不仔细以及并没有拼尽全力去打这几点总结应该注重休......
  • 28th 2022/7/27 USACO第二部分之一总结
    发现自己的能力再一次提升,真是好消息在DP方面更加熟练在模拟方面掌握了更多方法,更加成熟这就是热爱信息学带来的恩赐以后不畏困难,勇敢逾越山岭,这才是青春!路在脚下,梦......
  • 29th 2022/8/1 模拟赛总结18
    这次还行因为这次认真去打,而且在打T2两个钟时,仍旧能坚持下去,最好迎来了胜利不错的,但仍旧有一些不足在T2打完发现过了时,心花怒放,光顾着打暴力,结果没什么分,T1也没有静心......
  • 30th 2022/8/3 模拟赛总结19
    这次不是很烂,但是问题出现我的思路过于繁复,其实就是对前缀和的概念理解出了问题前缀和不一定是形如\(f_r-f_{l-1}\)只要加减的东西有意义,就可以了如\(f_{i,j}-f_{i-1......
  • 31st 2022/8/4 模拟赛总结20
    这次死在了小错误上虽然并没有考砸,但是本来可以考得更好T1想到了正解但是又是一个小问题断送了前程在求答案时,小数据还好,但是大数据。。。总之,就是在求答案是加上了......
  • 20th 2022/7/18 模拟赛总结12
    这次嗯,题目真是没有半点水分,干巴巴一片T1T3省选模拟,T2NOIP,恐怖的是T4???这次估计上紫赛时T1-T4-T2-T3首先读题很久,30min过,然后着手T1,找规律,没有半分,只用仅有的数论知识......