ABC-211:C=dp D=bfs

C

  • 题意: 给一个字符串,看你能找出多少个组合来形成字符串"chokudai",而且是有先后顺序的!

  • 一开始想着是把每个c,h,o,k,u,d,a,i的坐标存下来,每次去更新,类似双指针,但是这一下是6,7个,感觉时间,操作上有难度,那这个时候不如去存每个的方案数~

  • 那么就以f数组来记录每次的位置出现了就等于前面的方案数再加上本身


#include <iostream>
#include <cstring>
#include <algorithm>
#include<map>
using namespace std;

typedef long long ll;
const int N = 100010, mod = 1e9 + 7;

int n;
ll f[10];
string s;
map<char, int> pos;
string t = "chokudai";

int main(){
    for (int i = 0; i < 8; i++)pos[t[i]] = i;
    cin >> s;
    n = s.size();
    for (int i = 0; i < n; i++) {
        if (s[i] == 'c')f[0] += 1;
        else if (pos[s[i]]) {
                int x = pos[s[i]];
                f[x] = (f[x] + f[x - 1]) % mod;
        }
    }
    cout << f[7] % mod << "\n";
    return 0;
}

D

  • 题意 :求1城市到n城市 的最短距离 的方案数,要最短
  • 就是一个简单的bfs,标记是否访问,距离更新,最后统计一下由父节点到子节点的方案数,记得取余~
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

#define inf 1000000007
const int N = 2e5 + 10;

queue<int>q;
vector <int >G[N];
vector<int>way(N,0);
vector<int>vis(N,0);
vector<int>dis(N,inf);

int main() {
	int n, m; cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v; cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}

	q.push(1);
	vis[1] = 0;
	dis[1] = 0;
	way[1] = 1;

	while (!q.empty()) {
		int u = q.front(); q.pop();
		if (!vis[u]) {
			vis[u] = 1;
			for (int v : G[u]) {
				if (dis[v] > dis[u] + 1) {
					dis[v] = dis[u] + 1;
					q.push(v);
					way[v] = way[u];
				}
				else if (dis[v] == dis[u] + 1) {
					way[v] = (way[v] + way[u]) % inf;
				}
			}
		}
	}

	cout << way[n];
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DongGu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值