P6103 [EER2]直接自然溢出啥事没有
Posted Biadocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P6103 [EER2]直接自然溢出啥事没有相关的知识,希望对你有一定的参考价值。
第一眼直接按规则 DP,令 \\(0,1,2,3,4\\) 分别表示程序片段、语句、语句块、函数、值。
但测出来会发现算重了。
原因是通过两条不同的路径产生了贡献:
\\[\\texttt{NULL(0)}\\to\\texttt{{}(2)}\\to\\texttt{[]{}(3)}\\to\\texttt{([]{})(3)}\\to\\texttt{([]{})(4)}\\to\\texttt{([]{});(1)}\\to\\texttt{([]{});(0)}
\\]
\\[\\texttt{NULL(0)}\\to\\texttt{{}(2)}\\to\\texttt{[]{}(3)}\\to\\texttt{[]{}(4)}\\to\\texttt{([]{})(4)}\\to\\texttt{([]{});(1)}\\to\\texttt{([]{});(0)}
\\]
发现问题仅仅出现函数转移到值的情况,强制这一步不能加小括号。
这种题要难可以更难,不过就没有意思了是不是(也许你可以写个程序帮你推不会算重的状态转移方程)。
code:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
#define For(i,x,y)for(i=x;i<=(y);i++)
ull f[10005][5];
int main()
{
int n,i,j;
f[0][0]=f[1][1]=f[1][0]=1;
cin>>n;
For(i,2,n)
{
f[i][2]=f[i-2][0];
//规则 2
f[i][1]=f[i][2];
if(i>=4)f[i][3]=f[i-4][2];
f[i][3]+=f[i-2][2];
//规则 3
f[i][3]+=f[i-2][3];
f[i][4]=f[i][3]/*+f[i-2][3]*/;
//规则 4
f[i][4]+=f[i-2][4];
f[i][1]+=f[i-1][4];
//规则 5
For(j,0,i)f[i][0]+=f[j][0]*f[i-j][1];
//规则 1
}
cout<<f[n][0];
return 0;
}
//0 程序片段\\
1 语句\\
2 语句块\\
3 函数\\
4 值
以上是关于P6103 [EER2]直接自然溢出啥事没有的主要内容,如果未能解决你的问题,请参考以下文章