这些题主要是dfs
书接上文(1.29日)(相传********
题目二:扫描
这个就是上面的简单版因为只要找最大值原理相同就不多过多介绍了
#include <bits/stdc++.h>
using namespace std;
int a[10000000];
int main()
{
int m, k;
cin >> m >> k;
deque<int> q;
for (int i = 0; i < m; i++)
{
cin >> a[i];
}
for (int i = 0; i < m; i++)
{
while (!q.empty() && a[q.back()] < a[i])
{
q.pop_back();
}
q.push_back(i);
if (i >= k - 1)
{
cout << a[q.front()] <<endl;
if (i - q.front() >= k - 1)
{
q.pop_front();
}
}
}
return 0;
}
现在到bfs的主场了(瑟瑟发抖)
题三:糕手去散步(dog)
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100][100] = {0};
int book[10000] = {0};//标记数组
int v = 0;
int flag;
void dfs(int u)
{
for (int i = 1; i <= n; i++)
{
if (a[u][i] != 0 && book[i] != 1)
{
book[i] = 1;
flag += a[u][i];//记录步数
dfs(i);//例如从1到2现在i=2从2 再次开始摸索
book[i] = 0;//取消标记同时撤回步数
flag -= a[u][i];
}
}
v = max(v, flag);时刻更新v保持她永远是最大的
}
int main()
{
cin >> n >> m;//读入数据
for (int i=0;i<m;i++)
{
int x, y, z;
cin>>x>>y>>z;
a[x][y]=z;
a[y][x]=z;//这个路是相通的可以从一走到2依然可以从2走到1;
}
for (int i=1;i<=n;i++)//尝试不同的起点
{
book[i] = 1;//标记初始位置
dfs(i);
memset(book,0,sizeof(book));//清空
flag=0;//将其归0防止其出现错误
}
cout << v << endl;//输出最终结果
return 0;
}
题目四:
#include<bits/stdc++.h>//望能
using namespace std;
int a[15];
int l=0;
void dfs(int x)
{
if(x==0&&l>1)//终止条件分解到0就不能分了L>1是为了防止输出单个数字比如只输出7
{
for(int i=1;i<=l-1;i++)
{
cout<<a[i]<<"+";//输出正确的格式
}
cout<<a[l];
cout<<endl;
return ;//返回最近盗用的地方
}
for(int i=a[l];i<=x;i++)//从一开始分解
{
if(x-i>=0)
{
l++;
a[l]=i;
dfs(x-i);
l--;//撤回此时的a[l]
}
}
}
int main()
{
int n;//变量
cin>>n;//输入数据
a[0]=1;
dfs(n);//要拆分的数传入
}
明天再巩固一下dfs和学习kmp