zoukankan      html  css  js  c++  java
  • Codeforces Round #243 (Div. 1)——Sereja and Two Sequences

    题目链接

    • 题意:给两个长度分别为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;
    }


  • 相关阅读:
    QT学习笔记——06-Day16_C++_QT
    QT学习笔记——06-Day15_C++_QT
    QT学习笔记——06-Day14_C++_QT
    c++提高学习笔记——05-c++STLday13_贪吃蛇案例
    c++提高学习笔记——05-c++STLday12
    c++提高学习笔记——05-c++STLday11
    混子的 后缀数组 刷题记录
    POJ2528Mayor's posters 线段树,离散化技巧
    莫比乌斯反演 刷题记录
    P问题,NP问题,NPC问题学习笔记
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7118384.html
Copyright © 2011-2022 走看看