2018年9月15日acm学习日志

2018.9.15 ACM-ICPC 2018 焦作赛区网络预赛

A.Magic Mirror(过)

https://nanti.jisuanke.com/t/31710

签到题,将输入的字符串转换成大写再与给定字符串比较即可

B.Mathematical Curse(过)

https://nanti.jisuanke.com/t/31711

题意:给定原始整数K,给定长为N的非零整数串,再给定M个计算符,求用完M个计算符后最大的结果

思路:

动态规划

用两个二维数组g,h分别保存当前最大和最小的结果,从前往后枚举整数和计算符;

状态转移方程为:g(i,j)=max(g(i,j),g(i-1,j-1)f(j)a(i),h(i-1,j-1)f(j)a(i))

                             h(i,j)=max(h(i,j),h(i-1,j-1)f(j)a(i),g(i-1,j-1)f(j)a(i))

初始条件为g(0,0)=h(0,0)=k                    答案为g(n,m)

#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
#define INF 10000000000000000
using namespace std;
int n,m;
LL k,a[1005]={0};
LL g[1005][10],h[1005][10];
string s;
void Init()
{
	scanf("%d%d%lld",&n,&m,&k);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	cin>>s;
	s=" "+s;
}
LL Cal(LL a,char c,LL b)
{
	if(c=='+')return a+b;
	if(c=='-')return a-b;
	if(c=='*')return a*b;
	if(c=='/')return a/b;
}
LL Max(LL a,LL b)
{
	if(a>b)return a;
	return b;
}
LL Min(LL a,LL b)
{
	if(a<b)return a;
	return b;
}
void Solve()
{
	//初始化
	//memset(g,0,sizeof(g));
	//memset(h,0,sizeof(h));
	for(int i=0;i<=n;i++)
	for(int j=0;j<s.length();j++)
	{
		g[i][j]=-INF;
		h[i][j]=INF;
	}
	g[0][0]=h[0][0]=k;
	
	//动规
	int Len=s.length()-1;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=Len;j++)
	{
		g[i][j]=-INF;
		h[i][j]=INF;
		if(j>i)continue;
		if(i>j)g[i][j]=g[i-1][j];
		if(j>0)
		{
			g[i][j]=Max(g[i][j],Cal(g[i-1][j-1],s[j],a[i]));
			g[i][j]=Max(g[i][j],Cal(h[i-1][j-1],s[j],a[i]));
		}
		
		h[i][j]=h[i-1][j];
		if(j>0)
		{
			h[i][j]=Min(h[i][j],Cal(h[i-1][j-1],s[j],a[i]));
			h[i][j]=Min(h[i][j],Cal(g[i-1][j-1],s[j],a[i]));
		}
		//printf("%d**%d**%lld**%lld\n",i,j,g[i][j],h[i][j]);
	}
	
	printf("%lld\n",g[n][Len]);
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		Init();
		Solve();
	}
	return 0;
}
/*
1
5 4 833
712 -543 347 -135 -33 
-/*+
*/

注意:1.最多五个运算符,每个数绝对值最大为1000,应取无限大为10^15 ++

2.数组开大一点,不要抵着上限开

3.要注意合法状态不能由多余的非法状态转移得来

D.Sequence(未过)

https://nanti.jisuanke.com/t/31713

题意:设长度为M,每个位置最大数为N的数串中每个数字最大的出现次数为x,求x的期望

F.Modular Production Line(未过)

https://nanti.jisuanke.com/t/31715

题意:给出一定数目的区间,每个区间有个权值,求在覆盖次数不超过k的情况下,总权和的最大值

思路:费用流

猜你喜欢

转载自blog.csdn.net/konjacrz/article/details/82716069
今日推荐