Uva 6177

来源:互联网 发布:万人网络营销软件站 编辑:程序博客网 时间:2024/06/08 20:01

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4188

要用到DP 的思想,dp[n][k] 表示 长度为n,尾数为 k ,且最后两位是递增时的排列数;

如果将dp[n][k] 中所有的数”倒置“(n+1 - pos[i])。例如1 3 2 4  与 4 2 3 1 (有时不仅仅是逆置);(图片转载http://www.2cto.com/kf/201305/207857.html),,,

我们只要求

推导出DP 方程:dp[n][k] = dp[n][k-1] + dp[n-1][n+1-k];

#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <cmath>using namespace std;long long dp[22][22];//一位表示长度,二维表示最后一位为long long ans[22];void con(){     int i,j;     dp[1][1] = 1;     ans[1] = 1;     for(i = 2;i <= 20;i ++)          {               for(j = 2;j <= i;j ++)               {                    dp[i][j] = dp[i-1][i + 1 - j] + dp[i][j-1];                    ans[i] += dp[i][j];               }               ans[i] *= 2;//(包含了逆置后的)          }}int main(){     int t,num,m,i,j;     con();      long long tmp = 0;     scanf("%d",&t);     while(t --)     {          scanf("%d %d",&num,&m);          printf("%d %lld\n",num,ans[m]);     }     return 0;}


0 0
原创粉丝点击