hdu 5185 dp

hdu 5185 dp
题目:
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取余的结果就行。

限制:
T组数据:1 <= T <=20
1 <= n <= 50000
1 <= m <= 1e9

思路:
类似背包的dp,只是稍微变一下而已。
dp[i][j] 表示装满容量为i的背包,背包中体积最大的物品为j的方法数
dp[i][j]=dp[i-j][j-1]+dp[i-j][j]

需要注意的一点是由于题目限制,设最大的物品的体积为x,则有:
(x+1)*x/2=n,所以x最大值小于sqrt(2*n)。
所以每组数据时空复杂度都为O(50000*320)。

/*hdu 5185
  题目:
  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取余的结果就行。
  限制:
  T组数据:1 <= T <=20
  1 <= n <= 50000
  1 <= m <= 1e9
  思路:
  类似背包的dp,只是稍微变一下而已。
  dp[i][j] 表示装满容量为i的背包,背包中体积最大的物品为j的方法数
  dp[i][j]=dp[i-j][j-1]+dp[i-j][j]

  需要注意的一点是由于题目限制,设最大的物品的体积为x,则有:
  (x+1)*x/2=n,所以x最大值小于sqrt(2*n)。
  所以每组数据时空复杂度都为O(50000*320)。
 */
#include
  
  
   
   
#include
   
   
    
    
#include
    
    
     
     
using namespace std;
#define LL __int64
int MOD;
const int N=50005;
int dp[N][320];
void gao(int n,int m){
	MOD=m;
	int lim=sqrt(2*n);
	dp[0][0]=1;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=min(i,lim);++j){
			dp[i][j]=((LL)dp[i-j][j-1]+dp[i-j][j])%MOD;
		}
	}
	//for(int i=0;i<=n;++i){
	//	for(int j=1;j<=lim;++j)
	//		cout<
     
     
      
      <<' ';
	//	cout<
      
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值