这题说的是

x[1]+x[2]+x[3]+…+x[n]=n, 这里 
0 <= x[i] <= n && 1 <= i <= n 
x[i] <= x[i+1] <= x[i]+1 && 1 <= i <= n-1 
对于一个给定的n,Gorwin想要知道有多少xi的组合满足上述等式。由于结果比较大,输出答案对m取余的结果就行。

n<=50000

经过分析我们知道第一个数必须是 0  或者 1 ,如果是0 那么我们分析,第一个开始为1 的数字, 后面必须连续到结尾都是大于等于1 的个数,这么想前面的那些前导0将变得毫无意义,只是连续非0长度的个数,我们在计算中会计算出来的。现在我们有一个方案 dp[i][j] 表示前n项到达j的方案 数, 这样我们 有 n*n*n 的状态转移, 好了现在这个复杂度过大,我们可以想办法把它降下来,我们知道连续的数字 各个都不同最多才 sqrt(n)个,现在就降了一点了, 再想想我们摈弃了 0 那么意思说第一个数是从1开始的,那么我们就不用害怕他会使用超过n个数字来达到和为n 我们知道最多也就是使用n个分别都为1 ,其余的都得小于1,那么现在我们是不是又降了最外层的一个n , 现在复杂度变成了 nsqrt(n);

我们再整理一下, dp[i][j] 表示使用1-i个数字组成和为j的个数,(因为我们可以不讨论使用了多少个数字,因为他肯定不会超过n)时间复杂度刚好

dp[i][j]=( dp[i][j-i] + dp[i-1][j-i] )%m

//
// main.cpp
// hdu5185c++
//
// Created by opas on 15/3/15.
// Copyright (c) 2015年 opas. All rights reserved.
// #include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn = ;
const int maxm =;
int dp[maxm][maxn];
int main(int argc, const char * argv[]) {
// insert code here...
int cas;
scanf("%d",&cas);
int n,m;
for(int cc =; cc<= cas; ++cc){
scanf("%d%d",&n,&m); memset(dp, , sizeof(dp));
int k=,G=n;
while(k*(+k)<=G*) k++;
k--;
dp[][]=;
for(int i=; i<=k; ++i)
for(int j=i; j <= n ; ++ j ){
dp[i][j]= (dp[i-][j-i]+dp[i][j-i])%m;
}
int ans=;
for(int i=; i <= k; ++i )
ans= (ans+dp[i][n])%m;
printf("Case #%d: %d\n",cc, ans); }
return ;
}

hdu 5185 动态规划 分析降低复杂度的更多相关文章

  1. hdu 5185(动态规划)

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. CF #366 DIV2 C. Thor 模拟 queue/stack降低复杂度

    C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  3. hdu4334 Trouble 合并集合可以降低复杂度阿啦啦

    我觉得这一题方法很好的,但是之前完全没有碰到过,也没有想到,这么简单直接降低复杂度的方法 先将两个集合合并成1个集合,合并两个(s1,s2),即每个集合里n^2个数,还剩一个n个数的集合 这样还剩超时 ...

  4. hdu 5185 Equation(分析+DP)

    题意: Gorwin is very interested in equations. Nowadays she gets an equation like thisx1+x2+x3+⋯+xn=n, ...

  5. Android App性能评测分析-流畅度篇

    1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...

  6. hdu 1087 动态规划之最长上升子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online C ...

  7. HDU 1171 Big Event in HDU (动态规划、01背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. HDU 1003 动态规划

    http://acm.hdu.edu.cn/showproblem.php?pid=1003 这几天开始刷动归题目,先来一道签到题 然而做的并不轻松, 没有注意到边界问题, WA了几发才发现 #inc ...

  9. hdu 4055 && hdu 4489 动态规划

    hdu 4055: 一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶: 参照他的思路和代码: #include<cstdio> #include<cstring> # ...

随机推荐

  1. MySQL性能优化(三)-- 索引

    一.什么是索引及索引的特点 索引是一种数据结构 索引的特点:查找速度快,排好序,数据结构 索引的数据结构类型有:BTREE索引和HASH索引,下面展示的是BTREE索引. BTREE:balance ...

  2. PyQt4菜单栏

    菜单栏是GUI程序最明显的组成部分.它由一组位于不同菜单中的命令组成.在控制台程序中,我们必须记住那些晦涩难懂的命令.但在GUI程序中,通过菜单栏我们将命令合理的放置在不同的菜单中来降低学习新应用程序 ...

  3. SimpleDateFormat使用详解 <转>

    public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (d ...

  4. poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]

    Find the Winning Move Time Limit: 3000MS   Memory Limit: 32768K Total Submissions: 1286   Accepted:  ...

  5. 巡风代码架构简介以及Flask的项目文件结构简介

    一.巡风: 巡风是一款什么东西,想必安全同行都不陌生吧.用它作为内网漏洞扫描管理架构是一种很好的选择,扫描快,开源,还可自己编写符合规则的POC直接放入相应目录来扩展.今天下午趁着有点时间捋了一下巡风 ...

  6. centos6.8上安装paramiko

    author : headsen  chen date: 2018-10-07   17:06:07 # 安装gcc,python-devel yum -y install python-devel ...

  7. 项目中启动另外的一个app

    NSMutableString *webViewContent = [[NSMutableStringalloc] init]; [webViewContent appendString:@" ...

  8. DGbroker故障切换示例

    1.主库故障 SQL> startup ORACLE instance started. Total System Global Area bytes Fixed Size bytes Vari ...

  9. Web安全开发建议

    版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. Web安全问题,很多时候会被人所忽略,安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的. 实际上,只要我们养成一些 ...

  10. Mssql备份失败

    Mssql备份失败出现如下提示 备份时先删除默认的备份设备,自己选择路径