矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解

题目链接

  • 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e;2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分)
  • 分析:

    首先,问题其实就是转化成,进行若干次操作1,然后进行操作2

    还要找到一个判别标准,来评判较优的状态(贪心)

    每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大

    状态表示:

    简单的,一个状态可以表示为串A的位置、串B的位置、删除的次数

    但是两个串都比较长,如果用串A的位置、串B的位置来作为状态,删除次数作状态值,那么状态集合太大。所以只能以一个串为主串DP,那么删除的次数就应该作为状态,在B的位置应该作为状态的值

    操作(状态转移):

    假如对于A的每一个位置,都找到一个B中的位置(只有一个选择,必然是找最靠前的)并删除,那么有些状态是遍历不到的,而且很显然这种方法是错误的。正确的想法应该是,对于A的每一个元素,两种操作:删除或者不删除

    判别标准:

    每个状态只有一个值,当前串B的位置,看看是否可以判断;对于处理到A的相同位置,删除次数相同,那么在B的位置越小越好。可以作为判别标准

    显然,这个时候是存在贪心的。其实想一想,对于之前见到的DP,对于DP状态的合并其实也是基于贪心原理(距离最小,价值最小等等),有时候能找到贪心也就基本找到了DP的判别标准(进行状态合并)

const int MAXN = 100001;

int ipta[MAXN], iptb[MAXN];
int dp[2][310];
vector<int> vt[MAXN];
int main()
{
	//    freopen("in.txt", "r", stdin);
	int a, b, all, c, cnt;
	while (~RIV(a, b, all, c))
	{
		int cur = 0;
		CLR(dp, INF);
		REP(i, MAXN) vt[i].clear();
		cnt = (all + c - 1) / c;
		FE(i, 1, a) RI(ipta[i]);
		FE(i, 1, b)
		{
			RI(iptb[i]);
			vt[iptb[i]].push_back(i);
		}
		int ans = 0;
		FE(i, 1, a)
		{
			dp[cur][0] = 0;
			cur ^= 1;
			CLR(dp[cur], INF);
			FE(j, 1, cnt)
			{
				int pre = dp[cur ^ 1][j - 1];
				int p = upper_bound(all(vt[ipta[i]]), pre) - vt[ipta[i]].begin();
				if (p == vt[ipta[i]].size()) p = INF;
				else p = vt[ipta[i]][p];
				dp[cur][j] = min(dp[cur ^ 1][j], p);
				if (dp[cur ^ 1][j] > p && p + i + j * c <= all)
					ans = max(ans, j);
			}
		}
		WI(ans);
	}
	return 0;
}

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解,布布扣,bubuko.com

时间: 2024-08-01 10:33:11

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解的相关文章

矩阵乘法专题2——bzoj 1706 [usaco2007 Nov] relays 奶牛接力跑 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24960651 [原题] 1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 340  Solved: 162 [Submit][Status] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力

矩阵乘法专题3——bzoj 1898 [Zjoi2004]Swamp 沼泽鳄鱼 题解

[原题] 1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 425  Solved: 256 [Submit][Status] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这

矩阵乘法专题4——bzoj 2326 [HNOI2011] 数学作业 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24963747 [原题] 2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 853  Solved: 473 [Submit][Status] Description [分析]我们按数字的位数来划分.对于K位数,我们就可以专门设计一个矩阵来计算. 然后就是注意细节了. [代码] #include

[BZOJ 1297][SCOI2009]迷路

1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1418  Solved: 1017[Submit][Status][Discuss] Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定

BZOJ 1297 SCOI2009 迷路 矩阵乘法

题目大意:给定一个邻接矩阵,求1~n的边权恰好为T的路径条数 考虑当所有边权都是1的时候 那么显然邻接矩阵自乘T次之后a[1][n]就是答案 因为当边权为1的时候a[i][j]可以表示从第i个点转移到第j个点的方案数 显然这个符合矩乘的定义 现在边权最大为9 那么将一个点拆成9个 第i个点拆成的第j+1个点向第j个点连一条边权为1的边 那么i->j有一条边权为k的边等价于i向j拆成的第k个点连边 #include <cstdio> #include <cstring> #in

BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input 第一行包含两个整数,N T. 接下来有 N 行,每行一个长度为 N 的字符串. 第i行第j列为'0'表示从节点i到节点j没有边. 为'1'到'9'表示从节点i到节点j需要耗费的时间. Output 包

1297: [SCOI2009]迷路

1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 652  Solved: 442[Submit][Status] Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间. Input

splay专题复习——bzoj 3224 &amp; 1862 &amp; 1503 题解

[前言]快要省选二试了.上次去被虐出翔了~~这次即便是打酱油,也要打出风采!于是暂停新东西的学习,然后开始复习以前的知识,为骗分做准备.PS:区间翻转的暂时跳过,就算学了也来不及巩固了. [BZOJ3224] 3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1477  Solved: 570 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入

[BZOJ 1297][SCOI 2009]迷路(矩阵快速幂)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1297 分析:如果每条边的边权都是1,那么就相当于对邻接矩阵自乘T次(因为写一下递推式子f[i][j]=∑f[i][k]*f[k][j]等价于矩阵乘法的定义).但是这题每条边的边权是1~9. 所以可以把每个点i拆成9个点形成链状:i9->i8->i7->i6->i5->i4->i3->i2->i1 (这条链中每条边的长度都为1) 然后对于原图中的