目录
杨辉三角
p5732
#include<iostream>
#include<queue>
using namespace std;
void display(queue<int> Q){
queue<int> T=Q;
while(!T.empty()){
cout<<T.front()<<" ";
T.pop();
}
cout<<endl;
return;
}
int main(){
queue<int> Q;
int n;
cin>>n;
Q.push(1);
display(Q);
if(n==1) return 0;
Q.push(1);
display(Q);
if(n==2) return 0;
int f,s;
for(int i=3;i<=n;i++){
f=Q.front();
Q.pop();
Q.push(f);
for(int j=3;j<=i;j++){
s=Q.front();
Q.pop();
Q.push(f+s);
f=s;
}
Q.push(s);
display(Q);
}
return 0;
}
用STL写,要front()和pop()各写一遍。
找一篇好一点的题解
直接递推
a[i][j]=a[i-1][j]+a[i-1][j-1];
#include<iostream>
using namespace std;
const int N=25;
int main(){
int a[N][N];
int n;
cin>>n;
for(int i=1;i<=n;i++){
a[i][1]=a[i][i]=1;
}
for(int i=2;i<=n;i++){
for(int j=2;j<i;j++){
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
判断出栈合法性
看着这个题干我有点蒙,怎么才叫出栈合法啊?
简言之,就是每次出栈只能出栈顶元素。举个例子,当栈内为123时,你就只能先出3,而不能出12.
模拟yyds
#include<iostream>
#include<stack>
using namespace std;
string a,b;
bool vaild(){
int len=a.size();
stack<int> st;
for(int i=0,ct=0;i<len;i++){
st.push(a[i]);
while(!st.empty()&&b[ct]==st.top()){
st.pop();
ct++;
}
}
if(st.empty()) return true;
return false;
}
int main(){
cin>>a; //a为入栈的顺序
while(cin>>b){
if(valid()) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}
转化问题
1234567为例
因为先进后出的特性,出栈字符中一个元素后面比它小的数,都必须是递减
这个做法一些局限性,如果入栈并不是数字从大到小入栈的呢?(非要写的话也是可以写出来的,多一个结构体罢了)
#include<iostream>
using namespace std;
string a,b;
int main(){
cin>>a>>b;
int flag1=0;
int flag2=0; //如果序列不合法为1
for(int i=0,len=a.size();i<len;i++){
int tmp;
for(int j=i+1;j<len;j++){
if(a[j]<a[i]){
flag1=1;
tmp=a[j];
break;
}
}
if(flag1==1){
for(int k=j+1;k<len;k++){
if(a[k]<a[i]&&a[k]>tmp){
flag2=1;
break;
}
else if(a[k]<a[i]&&a[k]<tmp) tmp=a[k];
}
}
if(flag2==1) break;
}
if(flag2==1) cout<<"N"<<endl;
else cout<<"Y"<<endl;
return 0;
}
KMP模板
大陈曦老师说的,背住!
next数组
void getNext(string b,int *next){
int i=0,j=-1;
int next[0]=-1;
int len=b.size();
while(i<len){
if(j==-1||b[i]==b[j]){
j++;
i++;
next[i]=j;
}
else j=next[j];
}
return;
}
KMP
bool KMP(string a,string b,int next[]){
int i=0,j=0;
int len1=a.size(),len2=b.size();
while(i<len1&&j<len2){
if(j==-1||a[i]==b[j]){
i++;
j++;
}
else j=next[j];
}
if(j==len2) return true;
return false;
}
以上就是模板啦~
下面是洛谷p3375
#include<iostream>
#include<string>
using namespace std;
const int N=1e6+10;
string a,b;
void getNext(string b,int *next){
int i=0,j=-1,len=b.size();
next[0]=-1;
while(i<len){
if(j==-1||b[i]==b[j]){
j++;
i++;
next[i]=j;
}
else j=next[j];
}
return;
}
void KMP(string a,string b,int next[]){
int i=0,j=0;
int len=a.size();
while(i<len){
if(j==-1||a[i]==b[j]){
i++;
j++;
}
else j=next[j];
if(j==b.size()) cout<<i-j+1<<endl;
}
return;
}
int main(){
cin>>a>>b;
int next[N];
getNext(b,next);
KMP(a,b,next);
int i;
for(i=1;i<b.size();i++) cout<<next[i]<<" ";
cout<<next[i];
return 0;
}