计蒜客Concerts
题目链接
题意:有n天,每天都会有一只乐队的演唱会,一只乐队可多天进行演唱会,乐队编号为A~Z,按乐队编号给出john观看乐队演唱会的序列,每看完某乐队的演唱会都将休息相应天数
john将按序列逐个观看演唱会,那么john在这n天中的出勤情况有多少种?
解法:动态规划,从后往前推,f[i][j]表示第i+1天到第n天中看了k-j场演唱会的出勤情况种树;
得状态转移方程:f[i][j]+=f[i+1][j]+f[i+1+h[ap[i]-'A']][j+1],应需要取模以及判断边界因此代码写法将发生相应变化
即前i+2~n天看了k-j场的情况与第i+1天看了某乐队演唱会后休息相应天数后剩余的天数中看了k-j-1场的情况之和
题目所给数据范围有误;正确范围:n<=100000,k<=300
#includeusing namespace std; #define p 1000000007 int h[30],n,k,f[100005][305]; string sx,ap; int main(){ cin>>k>>n; for(int i=0;i<26;i++) cin>>h[i]; cin>>sx>>ap; for(int i=0;i =0;i--) for(int j=k-1;j>=0;j--){ f[i][j]+=f[i+1][j]; if(ap[i]==sx[j]&&i+1+h[ap[i]-'A'