409. 数的关系
时间限制 5000 ms
内存限制 65536 KB
题目描述
用关系“<”和“=”将3个数A、B和C依序排列时有13种不同的序关系:
A=B=C,A=B<C,A<B=C,A<B<C,A<C<B,A=C<B,B<A=C,
B<A<C,B<C<A,B=C<A,C<A=B,C<A<B,C<B<A 。
现在输入数字的个数,要求你给出上述关系的数目。
数的个数不大于100
输入格式
多组数据,EOF结束
每行一个输入
输出格式
对于每个输入,输出一行,即对应答案
输入样例
3
输出样例
13
dp方程: a[i][j]=a[i-1][j-1]*(j+1)+a[i-1][j]*(j+1) a[i][j],i为数字个数,j为式子中小于号的个数
教训:比赛时没有计算 n=1,2时的sum
代码:#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> using namespace std; struct bign { int len,s[500]; bign() //用途:每次声明变量时,自动初始化 { memset(s,0,sizeof(s)); len=1; } bign operator =(const bign& m) //重载=运算符 { for(int i=0;i<m.len;i++) { s[i]=m.s[i]; } len=m.len; } bign operator +(const bign& n) //重载+运算符 { bign d; memset(d.s,0,sizeof(d.s)); d.len=0; for(int i=0,g=0;g||i<max(len,n.len);i++) { int x=g; if(i<len) x+=s[i]; if(i<n.len) x+=n.s[i]; d.s[d.len++]=x%10; g=x/10; } return d; } }; bign c; struct bign sum[200],a[110][110]; int main() { int T,j,t,n,m,i,count,q; for(i=0;i<=100;i++) for(int k=0;k<=100;k++) { memset(a[i][k].s,0,sizeof(a[i][k].s)); a[i][k].len=1; } a[2][0].s[0]=1; a[2][1].s[0]=2;//a[i][j],i为数字个数,j为式子中小于号的个数 sum[1].s[0]=1; sum[2].s[0]=3; for(i=3;i<=100;i++) { memset(c.s,0,sizeof(c.s)); c.len=1; memset(sum[i].s,0,sizeof(sum[i].s)); sum[i].len=1; sum[i].s[0]=1; a[i][0].s[0]=1; for(j=1;j<=i-1;j++) { //a[i][j]=a[i-1][j-1]*(j+1)+a[i-1][j]*(j+1) c=a[i-1][j-1]+a[i-1][j]; for(int k=1;k<=j+1;k++) a[i][j]=a[i][j]+c; sum[i]=sum[i]+a[i][j]; } } while(scanf("%d",&n)!=EOF) { for(j=sum[n].len-1;j>=0;j--) { printf("%d",sum[n].s[j]); } printf("\n"); } return 0; }