经典例题不多说了。
ACcode:
#include<cstdio>
#include<cstring>
typedef long long LL;
const int NS=1000000;
LL dp[12][1<<10];
int state[NS][2],top;
void build(int pre,int now,int pos,int lim)
{
if (pos>lim) return ;
if (pos==lim)
{
state[top][0]=pre;
state[top++][1]=now;
return ;
}
build(pre<<2,now<<2,pos+2,lim);
build(pre<<1|1,now<<1,pos+1,lim);
build(pre<<1,now<<1|1,pos+1,lim);
}
LL solve(int n)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for (int j=1;j<=n;j++)
for (int i=0;i<top;i++)
dp[j][state[i][1]]+=dp[j-1][state[i][0]];
return dp[n][0];
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m),n+m)
{
if ((n*m)&1)
{
printf("0\n");
continue;
}
if (n<m) m=n^m,n=n^m,m=m^n;
top=0,build(0,0,0,m);
printf("%lld\n",solve(n));
}
return 0;
}
本文探讨了一种解决复杂动态规划问题的高效算法实现,并通过具体代码实例展示了其实现过程。重点介绍了状态压缩DP技巧,以及如何利用位运算优化算法性能。通过实例分析,读者可以深入了解动态规划的基本原理及其实现细节。
3421

被折叠的 条评论
为什么被折叠?



