2036: 聪明的阿卑多

来源:互联网 发布:南京证券开户软件 编辑:程序博客网 时间:2024/05/21 11:28

题目链接

题目大意:求用最少多少个数可以表示出1–n的所有数,并求方案数

题解:第一问同1192,第二问暴力dp即可,dp[i][j][k]ijk

我的收获:强强强

#include <vector>#include <algorithm>#include <utility>#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#define rep(i,n) for(int i=0;i<n;i++)#define tr(e,x) for(vector<int>::iterator e=x.begin();e!=x.end();e++)#define All(x) x.begin(),x.end()#define pb push_back#define OK puts("OK")const int inf=~0U>>1,maxn=1000+10,maxt=12;using namespace std;int Dp[maxn][maxt+1][maxn]={},n;int main(){    //freopen("in","r",stdin);    Dp[0][0][0]=1;    cin>>n;    for(int i=0;i<n;i++)        for(int j=0;j<maxt;j++)            for(int k=0;k<=n;k++)                if(int c=Dp[i][j][k])                {                    Dp[i+1][j][k]+=c;                    int l=0+i+1,r=k+i+1;                    if(l<=k+1&&j+1<maxt)                    {                        Dp[i+1][j+1][min(r,n)]+=c;                    }               }    //int t=1,cnt;    //for(;t<=n;t<<=1,cnt++);    //cout<<cnt<<" "<<Dp[n][cnt][n]<<endl;    for(int t=0;t<maxt;t++)    {        if(Dp[n][t][n])        {            cout<<t<<" "<<Dp[n][t][n]<<endl;            return 0;        }    }}
原创粉丝点击