完全自己写的代码,自己思路,觉得是dp,然后一开始找状态没找对,发现递推公式写不出来,然后根据自己感觉能写出来的递推公式,一点一点改状态,最后得到合适的状态。定义mm[i]表示的是i个字符且前两个字母是mm时,满足要求的队列的数量modn。mf,ff,fm以此类推。
递推公式:
mm[i]=mm[i-1]+mf[i-1];
mf[i]=ff[i-1]+fm[i-1];
fm[i]=mm[i-1];
ff[i]=fm[i-1];
因为要求数列最长的长度就需要知道之前的每一段长度,所以mm[0]到mm[end]都要遍历一遍,所以选择了递推。
由于数据变大会很快,一开始是每循环一次都要取余,然后超时了。改成循环十次取余过去了。
//Queuing HDU - 2604 #include #include #include #define N 1000500 using namespace std; int mm[N]={0}; int mf[N]={0}; int fm[N]={0}; int ff[N]={0}; int l,m; int main() { while(cin>>l>>m) { if(l==0) { cout<<0<
后来去网上查了题解,发现了其他的状态转移方程:F(n) = F(n-1)+ F(n-3)+ F(n-4);
另外在查题解的时候,发现了一种新的算法好像叫“快速矩阵幂”,好像可以优化速度,有时间仔细读一些,专门写一篇理解吧。