首页 > 其他分享 >P8816 [CSP-J 2022] 上升点列 题解

P8816 [CSP-J 2022] 上升点列 题解

时间:2022-11-14 23:57:35浏览次数:66  
标签:P8816 std ch point int 题解 2022 max dis

题目传送门:luogu P8816 [CSP-J 2022] 上升点列

这是一道简单的 dp 题。

定义到达指两点的曼哈顿距离是 \(1\)。

我们考虑设状态 \(f(i,j)\) 表示考虑结尾是第 \(i\) 个点,增加了 \(j\) 个点的情况。

\(f(i,j) = \max \{f(i,j), f(u,j) + 1\}\) 点 \(u\) 满足 \(u\) 可以被点 \(i\) 到达。

\(f(i,j) = \max \{f(i,j), f(u,j - dis) + dis + 1\}\) 点 \(u\) 满足可以被点 \(i\) 增加 \(dis\) 个点之后到达,且 \(dis < j\)。

答案就是 \(\max \{f(i,j) + k - j\}\)。

轻松ac(bushi

代码(良心马蜂,无压行

点击查看代码
#include <bits/stdc++.h>

namespace hello_world_djh {
    template <typename T>
    T read() {
        T x = 0, f = 1;
        char ch = getchar();
        for (; ch < '0' || ch > '9'; ch = getchar())
            if (ch == '-')
                f = ~f + 1;
        for (; ch >= '0' && ch <= '9'; ch = getchar())
            x = (x << 3) + (x << 1) + (ch ^ '0');
        return x * f;
    }
    
    unsigned popcount(unsigned x) {
		x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
		x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
		x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
		x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
		x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF);
		return x;
	}
	
	const int N = 510, K = 110;
	int f[N][K], n = read<int>(), k = read<int>();
	std::pair <int, int> point[N];
	
	#define x first
	#define y second

    int main() {
//    	freopen("out.txt", "w", stdout);
    	for (int i = 1; i <= n; i++) {
    		point[i].x = read<int>();
    		point[i].y = read<int>();
    		f[i][0] = 1;
		}
		std::sort(point + 1, point + n + 1);
		for (int i = 2; i <= n; i++)
			for (int j = 0; j <= k; j++) {
				if (j - 1 >= 0)
					f[i][j] = std::max(f[i][j], f[i][j - 1]);
				for (int u = 1; u < i; u++) {
					auto a = point[i];
					auto b = point[u];
					if (a.x < b.x || a.y < b.y)
						continue;
					if (abs(a.x - b.x) + abs(a.y - b.y) == 1)
						f[i][j] = std::max(f[i][j],
						f[u][j] + (abs(a.x - b.x) + abs(a.y - b.y) == 1));
				}
				for (int u = 1; u < i; u++) {
					auto a = point[i];
					auto b = point[u];
					if (a.x < b.x || a.y < b.y)
						continue;
					int dis = (a.x - b.x) + (a.y - b.y) - 1;
					if (j >= dis)
						f[i][j] = std::max(f[i][j], f[u][j - dis] + dis + 1);
				}
			}
		int ans = -1;
		for (int i = 1; i <= n; i++)
			for (int j = 0; j <= k; j++)
				ans = std::max(ans, f[i][j] + k - j);
		printf("%d\n", ans);
		return 0;
    }
};

int main() {
    hello_world_djh::main();
    return 0;
}

标签:P8816,std,ch,point,int,题解,2022,max,dis
From: https://www.cnblogs.com/hello-world-djh/p/p8816_solution.html

相关文章

  • 2022-11-14 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 2022级信息工程学院《C语言程序设计》阶段1考试
    ProblemA:七进制转换Solution要认真读题的题正经讲过无数次的进制转换,不断取mod做除法判断素数,\(2\)~\(\sqrt{n}\)有能除尽的是合数,否则是质数注意审题,“在此将......
  • P6406 [COCI2014-2015#2] Norma 题解
    前言洛谷上很多大佬都写的CDQ分治的解法。但看了某篇大佬的线段树解法,受益匪浅,于是决定写一篇题解来记录一下这种解法。前置知识:单调栈,线段树题目通道题目描述给......
  • CF1743F Intersection and Union 题解
    更好体验线段的贡献不好统计,考虑统计每一个点在不同情况中的被覆盖次数,那么每个点的被覆盖次数总和即为答案。设\(f_{i,j,0/1}\)表示\(i\)点在扫描到线段\(j\)时是......
  • 2022年02月25日-2021年02月27日 南京
    这是宝宝第一次来南京,我特地把家里收拾了一下提前买好了烟花,买了烛光晚餐的道具还有红酒,我们一起做饭然后共进晚餐,虽然这次我做的饭菜不咋地,但是我们能在一起二人世界还是......
  • 2022年02月06日 太湖
    这天是大年初六,是个好日子,这天我要去宝宝的老家,宝宝小时候呆过的地方。我早上起的很早,单枪匹马出发了,路过了太湖县城,驶入了山路,没过2小时到了,宝宝和弟弟已经在门前迎接我了......
  • 2022年01月29日-2021年01月30日 桐城
    29号早上的车回来的,中午去我外婆家吃的饭,因逢过年晚上,和宝宝的同事一起吃饭的再小芳酒楼,这次超超也回来了,感觉超超还挺逗的,晚上我们吃完后还去搓了顿麻将,我是真的不会打在......
  • 2022年01月15日-2021年01月16日 合肥
    这两天我们是真的开心,这是我们两第一次外出旅游,去了万达茂的游乐园,玩了大摆锤,过山车。跳楼机是真的不敢玩,太刺激了,这里面宝宝吃了一个很好吃的糖葫芦,看了一场精彩的马术表......
  • 广州2022CCPC补题
    IInfection知识点:树上背包第一次写树上背包的题目,没想到就是在区域赛中神奇的是树上背包的复杂度,看起来是\(O(n^3)\),但是实际计算只有\(O(n^2)\)学会树上背包后可......
  • 2022年06月04日-2021年06月05日 太湖县
    回宝宝家,这是第一次去宝宝太湖县的家,还是挺温馨的,阿姨去了还给我炖了个老母鸡汤,确实不错什么都不放原始的鸡肉香味,周日中午去汉庭酒店旁边买了一点龙虾带到酒店吃,还可以,路......