计蒜客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

#include
using 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'