链接: P6103 [EER2]直接自然溢出啥事没有
出题人的语文很好吗?整篇阅读理解给我们做!整个都搞晕了,在题解的帮助下,画个图理解下。
设:
dp[i][0]为语句数;
dp[i][1]为程序片段数;
d
p
[
i
]
[
1
]
=
∑
j
=
0
i
−
1
d
p
[
j
]
[
1
]
∗
d
p
[
i
−
j
]
[
0
]
dp[i][1]= \sum_{j=0}^{i-1}dp[j][1]*dp[i-j][0]
dp[i][1]=∑j=0i−1dp[j][1]∗dp[i−j][0]
dp[i][2]为语句块;
d
p
[
i
]
[
2
]
=
d
p
[
i
−
2
]
[
1
]
dp[i][2]=dp[i-2][1]
dp[i][2]=dp[i−2][1]
dp[i][3]为函数;
d
p
[
i
]
[
3
]
=
d
p
[
i
−
2
]
[
3
]
+
d
p
[
i
−
2
]
[
2
]
+
d
p
[
i
−
4
]
[
2
]
dp[i][3]=dp[i-2][3]+dp[i-2][2]+dp[i-4][2]
dp[i][3]=dp[i−2][3]+dp[i−2][2]+dp[i−4][2]
dp[i][4]为值;
d
p
[
i
]
[
4
]
=
d
p
[
i
]
[
3
]
+
d
p
[
i
−
2
]
[
3
]
+
d
p
[
i
−
2
]
[
4
]
dp[i][4]=dp[i][3]+dp[i-2][3]+dp[i-2][4]
dp[i][4]=dp[i][3]+dp[i−2][3]+dp[i−2][4]
dp[i][0]:
d
p
[
i
]
[
0
]
=
d
p
[
i
]
[
2
]
+
d
p
[
i
−
1
]
[
4
]
dp[i][0]=dp[i][2]+dp[i-1][4]
dp[i][0]=dp[i][2]+dp[i−1][4]
因为已知条件为dp[0][1]=1;dp[1][0]=1;dp[1][1]=1;
所以长度为0和1的语句与片段,后续循环中的的求解顺序为:语句块dp[][2]>函数dp[][3]>值dp[][4]>语句dp[][0]>片段dp[][1];
参考代码:
//copy tj
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef unsigned long long ull;
ull n, dp[100010][5];
int main(){
cin>>n;
dp[0][1] = dp[1][0] = dp[1][1] = 1;
for(int i = 2; i <= n; ++i){//要求的是dp[][1] ;
dp[i][2] = dp[i - 2][1];//语句块由判断得来
dp[i][3] = dp[i - 2][2] + dp[i - 2][3];//语句块+2,函数+2得到函数
if(i >= 4) dp[i][3] += dp[i - 4][2];//语句块+2+4得到函数
dp[i][4] = dp[i][3] + dp[i - 2][4];//注意这里
dp[i][0] = dp[i][2] + dp[i - 1][4];
for(int j = 0; j < i; ++j) dp[i][1] += dp[j][1] * dp[i - j][0];//根据上述情况模拟
}
cout<<dp[n][1]<<endl;
return 0;
}