HDU_5456_数位dp
2024-09-06 06:50:13
http://acm.hdu.edu.cn/showproblem.php?pid=5456
转化成a=b+c,dp[i][a][b][c]表示剩余i木棒,a是否有进位,b是否首尾,c是否首位,注意每次都要memset。
#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std; int n,m,stick[] = {,,,,,,,,,};
LL dp[][][][]; LL dfs(int sum,int a,int b,int c)
{ if(sum < ) return ;
if(dp[sum][a][b][c] != -) return dp[sum][a][b][c];
if(b && c)
{
if(!a && sum == ) return ;
if(a && sum == stick[]) return ;
}
if(sum == ) return ;
LL& temp = dp[sum][a][b][c];
temp = ;
if(b == && c == )
{
for(int i = ;i <= ;i++)
{
for(int j = ;j <= ;j++)
{
int sub = stick[i]+stick[j]+stick[(i+j+a)%];
temp += dfs(sum-sub,(i+j+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+j+a)/,,);
if(j != ) temp += dfs(sum-sub,(i+j+a)/,,);
if(i != && j != ) temp += dfs(sum-sub,(i+j+a)/,,);
temp %= m;
}
}
}
else if(b == )
{
for(int i = ;i <= ;i++)
{
int sub = stick[i]+stick[(i+a)%];
temp += dfs(sum-sub,(i+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+a)/,,);
temp %= m;
}
}
else if(c == )
{
for(int i = ;i <= ;i++)
{
int sub = stick[i]+stick[(i+a)%];
temp += dfs(sum-sub,(i+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+a)/,,);
temp %= m;
}
}
temp %= m;
return temp;
}
int main()
{
int T;
scanf("%d",&T);
for(int i = ;i <= T;i++)
{
memset(dp,-,sizeof(dp));
scanf("%d%d",&n,&m);
printf("Case #%d: %lld\n",i,dfs(n-,,,));
}
return ;
}
最新文章
- 对c++ public、protected、private关键字的理解
- laravel打印sql语句
- Angular JS 学习之服务(Service)
- .Net 自定义应用程序配置
- CheckBoxList1复选框
- remove duplicates in Postgres(sql去重)
- Python一些难以察觉的错误
- 在Windows 上安装SQL Server的一些注意事项
- java遍历泛型的方法
- SSAS-时间维度的标准设计
- mysql 时间差问题集锦
- mybatis 基础
- oracle查询表索引
- 【算法】LeetCode算法题-Valid Parentheses
- 第26月第23天 nsobject 单例 CFAbsoluteTimeGetCurrent
- 详解Zookeeper原理与应用场景
- python补充3
- Android GridView数据绑定
- Android Viewpager加Fragment做界面切换时数据消失的解决方式
- sencha touch list更新单行数据