3.20~3.21总结

3.20

昨天主要在刷题,前天打了两把比赛,对自己不是很满意,就主要发一下题解吧;

https://vjudge.net/contest/547627#problem/L

其实挺奇怪哈,DNA不是双链吗?开个玩笑 哈哈;

思路:这题就是一个深搜,不过很难想到,这题是可以慢慢构建一个满足条件的序列,按照ACGT的顺序,对每个序列进行匹对,如果有与你要构建的字符相等的话就将该序列的标记长度减一;然后重新开始dfs,但是这题要注意回溯,不要搞混;

我也不太会说,我看见csdn上面有个图,非常清楚,现在将他奉上;、

 然后代码;

#include<stdio.h>
#include<string.h>

int n, LEN;
struct noode
{
	char s[11];
	int len;
}a[10];
char c[10] = "ACGT";
int pos[10];
int book[10];
char ss[100];
int max(int x, int y)
{
	if (x > y)return x;
	return y;
}
int get_l() {
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		ans = max(ans, a[i].len - pos[i]);
	}
	return ans;
}
//int dfs()
//{
//	int ans = 0;
//	for (int i = 0; i < 4; i++)
//	{
//		int flag = 0;
//		for (int j = 1; j <= n; j++)
//		{
//			if (a[j].s[pos[j]] == c[i]) {
//				pos[j]++;
//				flag = 1;
//			}
//		}
//		if (flag == 1)
//		{
//			ss[ans] = c[i];
//			printf("%s\n", ss);
//			ans++;
//		}
//	}
//	if (get_l() == 0)
//	{
//		return ans;
//	}
//}
int dfs(int step)
{
	if (step + get_l() > LEN) {
		return 0;
	}
	if (get_l() == 0) {
		return 1;
	}
	int temp[10];
	for (int i = 0; i < 4; i++) {
		int flag = 0;
		for (int j = 1; j <= n; j++) {
			temp[j] = pos[j];
		}
		for (int j = 1; j <= n; j++) {
			if (a[j].s[pos[j]] == c[i]) {
				flag = 1;
				pos[j]++;
			}
		}
		if (flag) {
			if (dfs(step + 1))
				return 1;
			for (int j = 1; j <= n; j++)
			{
				pos[j] = temp[j];
			}
		}
	}
	return 0;
}
int main()
{
	int t, maxn = 0;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d", &n);
		maxn = 0;
		for (int i = 1; i <= n; i++)
		{
			scanf("%s", a[i].s);
			a[i].len = strlen(a[i].s);
			maxn = max(maxn, a[i].len);
			pos[i] = 0;
		}
		LEN = maxn;
		while (1)
		{
			if (dfs(0))break;
			LEN++;
		}
		printf("%d\n",LEN);
	}
	return 0;
}

https://vjudge.net/contest/547627#problem/H

这题是真的困扰了我很久,花了很长时间都没有将这题写出;讲一下思路吧;

首先这题肯定要用广搜,用深搜的话一定会时间超限,其次你要能够记录每一种情况,这个可以用hash和康托展开来实现,我个人比较喜欢康托展开,因为不用考虑哈希冲突,然后关键的就是要反向bfs,我们要将所以能够到达要求的序列求出来,其实就是打了个表,然后判断你输入的情况能否有解;如果有解,就将结果输出;

由于代码有点问题,就不展示了;

3.21

这天即刷了题,也学了java;

https://vjudge.net/contest/547627#problem/P

这题看着挺复杂,其实很简单,就是一个加了条件的dfs;首先写0题,然后对0题后面的每个题目进行扩展,如果扩展遇到比自己之前时间少的时候,就停止;

代码:

#include<stdio.h>
int n;
int a[20][20], book[20][20], book2[20];
int ans = 9999;
void dfs(int x,int cnt,int sj)
{
	for (int i = 0; i < n; i++)
	{
		if (book[x][i] == 0&&a[x][i]>=sj&&book2[i]==0)
		{
			book[x][i] = 1;
			book[i][x] = 1;
			book2[i] = 1;
			cnt++;
			dfs(i, cnt, a[x][i]);
			book2[i] = 0;
			book[x][i] = 0;
			book[i][x] = 0;
			cnt--;
		}
	}
	if (ans < cnt)
	{
		ans = cnt;
	}
	return;
}
int main()
{
	while (~scanf("%d", &n))
	{
		
		ans = 0;
		for (int i = 0; i < n; i ++ )
		{
			for(int j=0;j<n;j++)
			{
				scanf("%d", &a[i][j]);
				book[i][j] = 0;
				book2[i] = 0;
				if (i == j)
				{
					book[i][j] = 1;
				}
			}
		}
		book2[0] = 1;
		dfs(0,0,0);
		printf("%d\n", ans+1);
	}
	return 0;
}

Java学习:

比较重要的:

1. java中的方法,相当于c语言中的函数的区别;

Java中方法名可以相同,存在方法的重载;而c语言中函数名是不能相同的;

 并且在Java中的方法是能够返回数组的,这就比c语言要好得多,方便的多;并且了解了一下,Java的内存分配的规则;

明天应该能够学到面向对象了,比自己想象中的慢很多;唉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值