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的内存分配的规则;
明天应该能够学到面向对象了,比自己想象中的慢很多;唉!