zoukankan      html  css  js  c++  java
  • <动态规划> 选数统计

    问题 J: 【动态规划】选数统计

    时间限制: 1 Sec  内存限制: 64 MB

    题目描述

    现在从1 ~ M里可以让你从小到大选出n个数,设这些数为A1到An,要求每个数至少为它前一项的2倍,比如说当M = 10,n = 4时,下面是几种可能的选法:
    1 2 4 8
    1 2 4 9
    1 2 4 10
    1 2 5 10
        求一共可以选出多少不同的数列?

    输入

    仅有一行,表示n (n ≤8)和M (M≤ 500)

    输出

    一个数表示方案数。

    样例输入

    4 10
    

    样例输出

    4
    

    分析:显然是构造dp,dp[i][j]表示长度为i,以j结尾的合法方案数。则dp[i][j]=sum(dp[i-1][k]) k>0&&k<j&&j>2*k.
    include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
     
    int main()
    {
        int dp[15][505]={0};
        int n,m;
        cin>>n>>m;
        //dp[i][j]==dp[i-1][k] if(j==0&&j/k=2)
        int i,j,k;
        for(i=1;i<=m;i++)
        {
            dp[1][i]=1;
        }
        for(i=2;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(k=1;k<=j;k++)
                {
                    if(j>=2*k)
                    {
                        dp[i][j]+=dp[i-1][k];
                    }
                }
            }
        }
        int ans=0;
        for(i=1;i<=m;i++)
        {
            ans+=dp[n][i];
        }
        cout<<ans<<endl;
        return 0;
    }
    
     
  • 相关阅读:
    Junit单元测试
    Stream流方法引用
    Stream流思想和常用方法
    算法
    函数式接口
    Zookeeper理解
    GreenPlum学习之(Share-nothing)架构
    链表反转问题
    KMP算法的java实现
    KMP详解之二
  • 原文地址:https://www.cnblogs.com/zyf3855923/p/8617841.html
Copyright © 2011-2022 走看看