hdu 5185 Equation (完全背包变形)
来源:互联网 发布:ubuntu terminal 配置 编辑:程序博客网 时间:2024/06/06 18:58
题意:
给出n个数字,数字满足 x[i]<=x[i+1]<=x[i]+1;要使得这n个数的和为n,有多少种方案。
题解:
类似于完全背包,dp[i][j]以j为结尾重量为i的方案数。我们通过分析会发现对于某个重量i,数字能取到的最大值是(sqrt(8*i+1)-1)/2,根据前n项和变形而来。这样就把复杂度从O(n^2)变为O(nsqrt(n))。
转移方程 dp[i][j]=dp[i-j][j-1]+dp[i-j][j] 对于这样的重量i,以j数字为结尾任然可以再次原则j,以j-1数字为结尾肯定也可以选择j,对应的上个重量都是i-j。着里的重量其实就是多了数字的和。
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<hash_map>#include<set>using namespace std;#define B(x) (1<<(x))typedef __int64 ll;const int oo=0x3f3f3f3f;const ll OO=1LL<<61;const int MOD=10007;const int maxn=50005;const int maxm=320;int dp[maxn][maxm];int main(){ int T,n,m,mod; scanf("%d",&T); for(int cas=1;cas<=T;cas++){ scanf("%d %d",&n,&mod); memset(dp,0,sizeof dp); dp[0][0]=1; for(int i=1;i<=n;i++){ m=(sqrt(8*i+1.0)-1.0)/2.0; for(int j=1;j<=m;j++){ dp[i][j]=(dp[i-j][j-1]+dp[i-j][j])%mod; } } int ans=0; for(int i=1;i<=m;i++) ans=(ans+dp[n][i])%mod; printf("Case #%d: %d\n",cas,ans); } return 0;}
0 0
- hdu 5185 Equation (完全背包变形)
- HDU 5185 Equation 完全背包变形.
- HDU 5185 Equation (线性dp 完全背包)
- hdoj 5185 Equation (线性dp 完全背包)
- hdu 1398 Square Coins 完全背包变形
- 完全背包变形--hdu-1114-Piggy-Bank
- HDU 1114 Piggy-Bank 完全背包变形
- HDU 1114 Piggy-Bank 完全背包变形
- HDU1114 完全背包变形
- hdu5534 完全背包变形
- nyoj331 完全背包变形
- HDU 1114 Piggy-Bank 完全背包的变形
- HDU 5534 Partial Tree (变形完全背包 好题)
- [hdu 5410 CRB and His Birthday] 完全背包变形
- HDU 1114 Piggy-Bank(完全背包动态规划+变形)
- poj 1882完全背包变形
- UVA 10313(完全背包变形)
- 完全背包的变形POJ1252
- 请你知道:干程序是一项伟大的事业
- ios回复购买商品
- cocos2dx-3.4 lua import
- OpenLayers中的图层
- xcode6模拟器路径
- hdu 5185 Equation (完全背包变形)
- 实验: ASSM内部存储研究大揭密
- hadoop运维汇总篇
- 方便好使的java.util.Properties类
- C++11 学习札记(一)
- TextView加载html标签,实现textview字体颜色随机变化
- (4.1.7)Editext自动获取焦点
- python安装
- 4sum