算法高效技巧之活用递推

  有很多题目需要细心考虑过程中是否可能存在递推关系,如果能找到这样的递推关系,就能事时间复杂度下降不少。例如就这一类涉及序列的题目来说,假如序列的每一位所需要的计算的值都可以通过该位左右两侧的结果计算得到,那么就可以考虑所谓的“左右两侧的结果”是否能通过递推进行预处理来得到,这样在后面的使用汇总就可以不必反复求解。

  例题:PAT乙级1040 / 甲级1093    有几个PAT

字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。

现给定字符串,问一共可以形成多少个PAT?

输入格式:

输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。

输出格式:

在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。

输入样例: 
APPAPT 
输出样例: 
2

 

  思路:

  直接暴力求解肯定会超时。

  换个角度思考问题,对一个确定位置的A来说,以它形成的PAT的个数等于它左边的p的个数乘以它右边T的个数。例如对字符串APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2*1=2。于是问题就转换为:对自复查un中的每个A,计算它左边的P的个数和右边的T的个数的乘积,然后把所有A的这个乘积相加就是答案。

 

  代码如下:

   

#include <iostream>
#include <string>
using namespace std;
int main(){
  string str;
  cin>>str;
  int leftNum[110000]={0},rightNum=0;
  int result=0;
  for(int i=0;i<str.size();i++){
    if(i>0){
      leftNum[i]=leftNum[i-1];//继承上一个的个数,继续统计 
    }
    if(str[i]=='P')
      leftNum[i]++;
  }
  for(int i=str.size()-1;i>0;i--){
    if(str[i]=='T'){
      rightNum++;
    }else if(str[i]=='A'){
      result=(result+leftNum[i]*rightNum)%1000000007;
    }
  }
  cout<<result;
  return 0;
}

  

 

转载于:https://www.cnblogs.com/hxtblogs/p/7654690.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值