ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2017 TCO Algorithm Round 2C - Division I, Level Three TreasureOfWinedag 题解

2021-07-02 20:00:18  阅读:236  来源: 互联网

标签:TreasureOfWinedag Division 26 25 int 题解 pos dp define


TreasureOfWinedag 题解

最终答案一定在区间\([k,k+25]\)之间。

考虑暴力dp,\(dp_{i,j}\)表示考虑了前i个字符,分成了恰好k段的方案数。

\(dp_{i,j}\in [j,j+25]\),设\(f_{i,j}=dp_{i,j}-j\) ,\(f_{i,j}\in [0,25]\)。

可以发现\(f_{i,j}\)递减,因为\(dp_{i,j}\)随着\(j\)递增,但是最多增加1。

考虑对\(f\)进行\(dp\),\(f_{i,j}=\min\{f_{k,j-1}+cost(k+1,i)-1\}\)。

由于\(cost(k+1,i)\)的取值有限,所以枚举\(cost(k+1,j)\),找到最小的下标\(k\)。

令\(g_{i,k}\)表示最小的\(j\),满足\(f_{i,j}\leq k\)。

可以直接对其dp。

code:

/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MAXN=1e5+1;
int g[MAXN][26],pre[26],P[26];
int f(int i,int j){
	if(j>i) return INF;
	if(i==0) return 0;
	if(j==0) return INF;
	int l=0,r=25;
	while(l<r){
		int mid=(l+r)>>1;
		if(g[i][mid]<=j) r=mid;
		else l=mid+1;
	}
	return l;
}
int queryg(int i,int j){
	int ans=INF;
	rep(k,26){
		if(k<=j) check_min(ans,g[P[k]-1][j-k]+1);
	}
	return ans;
}
class TreasureOfWinedag{
	public:
		int solvePuzzle(int n, int k, int m, int c0,vector<int> c1, vector<int> c2, vector<int> c3, vector<int> c4, string s){
			rb(i,s.length(),n-1){
				int t = (1ll*i * c0) % m;
				char nc = 'z';
				rep(j,25)
					if ((t >= c3[j]) and (t <= c4[j]) and ((t % c1[j]) == c2[j])){
						nc='a'+j;
						break;
					}
				s.PB(nc);
			}
			s='$'+s;
			rb(i,1,n){
				int ch=s[i]-'a';
				pre[ch]=i;
				vector<int> pos;
				rep(j,26) if(pre[j]) pos.PB(pre[j]+1);
				sort(ALL(pos));
				reverse(ALL(pos));
				rep(j,pos.size()){
					if(j){
						P[j-1]=pos[j];
					}
				}
				P[pos.size()-1]=1;
				rep(j,26){
					g[i][j]=queryg(i,j);
				}
			}
			return f(n,k)+k;
		}
}solver;

标签:TreasureOfWinedag,Division,26,25,int,题解,pos,dp,define
来源: https://www.cnblogs.com/gary-2005/p/14964700.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有