首页 > 其他 > 详细

P6103 [EER2]直接自然溢出啥事没有

时间:2021-06-07 00:32:21      阅读:20      评论:0      收藏:0      [点我收藏+]

第一眼直接按规则 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]直接自然溢出啥事没有

原文:https://www.cnblogs.com/May-2nd/p/14856766.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!