PAT B1040有几个PAT(递推)

1. 问题描述:

字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是由第二位(P),第四位(A),和第六位(T)组成的,第二个PAT是由第三位(P)、第四位(A),和第六位(T)组成的,现给定字符串,问一共可以形成多少个PAT?

2. 思路分析:

① 假如使用暴力破解依次遍历字符串来判断是否形成了PAT,那么肯定是超时的

② 我们可以使用另外一个思路来思考问题,对于一个确定的位置A来说,以它形成PAT的各式等于它左边的P的个数乘以右边T的个数,假如对字符串APPAPT中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2 * 1 = 2,于是问题就转化为对字符串中的每一个A计算它左边P的个数和右边T的个数的乘积,然后把所有A的乘积加起来就是我们需要求解的结果

③ 我们在求解左边P的个数的时候,可以设置一个数组leftNumP来记录当前i位置左边p的个数,从左边遍历字符串,如果当前位i是P,那么leftNumP[i]等于leftNumP[i - 1] + 1,如果不是P那么等于上一个位置的P的个数,我们在从右往左计算的时候为了节省代码量可以在遍历的时候计算出答案,定义一个遍历rightNumT记录当前位置有多少个T了,假如不是T是A那么让ans加上leftNumP[i] * rightNumT的值

④ 上面的思路正是体现了递推的思想,我们在思考问题的时候需要培养出这样的思维,因为假如我们使用递归可以解决的时候,可以跟暴力破解消耗的时间就不是在一个数量级上的了

3. 下面是具体的代码:

#include<stdio.h>
#include<cstring>
const int maxn = 100010;
const int MOD = 1000000007;
char str[maxn];
int leftNumP[maxn] = {0};
int main(void){
	gets(str);
	int len = strlen(str);
	for(int i = 0; i < len; ++i){
		if(i > 0){
			leftNumP[i] = leftNumP[i - 1];
		}
		if(str[i] == 'P'){
			leftNumP[i]++;
		}
	}
	int ans = 0, rightNumT = 0;
	for(int i = len - 1; i >= 0; i--){
		if(str[i] == 'T'){
			rightNumT++;
		}else if(str[i] == 'A'){
			ans = (ans + rightNumT * leftNumP[i]) % MOD;   
		}
	}
	printf("%d\n", ans);
	return 0;
}

 

以下是几个递推最小二乘法的Python程序: 1. 递推最小二乘法(TLS)的基本实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的基本实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) Q[i, :] = q / np.linalg.norm(q) b += y[i] * Q[i, :] R += np.outer(Q[i, :], x) theta = np.linalg.solve(R, b) return theta ``` 2. 递推最小二乘法(TLS)的改进实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的改进实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) r = np.linalg.norm(q) if r > 1e-12: Q[i, :] = q / r b += y[i] * Q[i, :] R += np.outer(Q[i, :], x) theta = np.linalg.solve(R, b) return theta ``` 3. 递推最小二乘法(TLS)的加速实现: ```python import numpy as np def TLS(X, y): """ 递推最小二乘法(TLS)的加速实现 X: 数据矩阵 y: 目标向量 """ n, p = X.shape Q = np.zeros((n, n)) R = np.zeros((p, p)) b = np.zeros(p) for i in range(n): # 递推公式 x = X[i, :] q = x - np.dot(Q[:i, :].T, x) r = np.linalg.norm(q) if r > 1e-12: Q[i, :] = q / r b += y[i] * Q[i, :] for j in range(i): qj = Q[j, :] R[j, :] += qj * np.dot(qj, x) R[i, :] = r * q theta = np.linalg.solve(R, b) return theta ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值