UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

I - 邱老师选妹子(二)

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

邱老师长得帅这是人尽皆知,于是追他的妹子就会很多。但是你知道,邱老师是一个很专一的人,所以他心里面只能有一个人。于是他决定从追他的众多妹子里挑选一个出来。

在第一轮的选拔中,剩余了一些妹子。酱神又给邱老师出主意了,因为最近酱神刚刚学习了最长上升子序列,所以这次,依然是把妹子们编号,从l到r,一共r-l+1个,这次要求妹子的

编号按照字符来处理,使得最长上升子序列正好是k,比如123是3,321是1.

求剩下的妹子的个数

Input

一开始是一个整数t<=1000,表示的是数据组数,接下来t行,每行是l,r,k 0<l<=r<2^63-1 1<=k<=10

Output

每组数据输出占一行,为一个整数,表示剩下的妹子的个数

Sample input and output

Sample Input Sample Output
1
123 321 2
139

解题思路:

贪心维护最长上升子序列即可

f(i,f1,f2,f3,k)

i  -> 正在转移第 i 位

f1 -> 前面是否大于过下界

f2 -> 前面是否小于过上界

f3 -> 是否有前导0

k  -> 前面出现的数的集合 (贪心维护最大)

为什么这样是正确的呢?

我们考虑这样的数字 1 4 3

我们认为最长上升显然是 1 3 ,而不会考虑到1 4,这样可以保证不会遗漏解,故是正解的

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
typedef long long ll;
using namespace std;

int tark,maxlen;
string A,B;
ll f[22][2][2][2][1<<10];

inline int GetLength(int k)
{
   int len = 0;
   for(int i = 0 ; i < 10 ; ++ i)
    if (k >> i & 1)
     len++;
   return len;
}

inline int tanxinset(int k,int pos) //贪心维护
{
   for(int i = pos ; i < 10 ; ++ i)
    if (k >> i & 1)
     return (k & ~(1 << i) ) | (1 << pos);
   return k | (1 << pos);
}

ll dp(int cur,int f1,int f2,int f3,int k)
{
   if (f[cur][f1][f2][f3][k] != -1)
    return f[cur][f1][f2][f3][k];
   ll &ans = f[cur][f1][f2][f3][k] = 0;
   if (cur == maxlen)
    {
       int len =  GetLength(k);
       if (len == tark)
        return ans = 1;
       else
        return ans = 0;
    }
   int st = f1?0:A[cur]-‘0‘;
   int ed = f2?9:B[cur]-‘0‘;
   for(int i = st ; i <= ed ; ++ i)
    {
      if (f3 && i == 0) //拥有前导零,这个不算上升的
       ans += dp(cur+1, f1 | i > A[cur]-‘0‘ , f2 | i < B[cur]-‘0‘ , f3 & !i, 0 );
      else
       ans += dp(cur+1, f1 | i > A[cur]-‘0‘ , f2 | i < B[cur]-‘0‘ , f3 & !i, tanxinset(k,i)  );
    }
   return ans;
}

int main(int argc,char *argv[])
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  int Case;
  cin >> Case;
  while(Case--)
   {
         cin >> A >> B >> tark;
         memset(f,-1,sizeof(f));
         maxlen = B.size();
         while(A.size() != maxlen)
          A = ‘0‘ + A;
         printf("%lld\n",dp(0,0,0,1,0));
   }
  return 0;
}
时间: 2024-10-14 01:02:57

UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>的相关文章

UESTC_菲波拉契数制 2015 UESTC Training for Dynamic Programming&lt;Problem E&gt;

E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 我们定义如下数列为菲波拉契数列: F(1)=1 F(2)=2 F(i)=F(i−1)+F(i−2)(i>=3) 给定任意一个数,我们可以把它表示成若干互不相同的菲波拉契数之和.比如13有三种表示法 13=13 13=5+8 13=2+3+8 现在给你一个数n,请输出把它表示成若干互

UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming&lt;Problem B&gt;

B - 秋实大哥掰手指 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 2048/1024KB (Java/Others) Submit Status 秋实大哥发现数据结构专题出到了N题,但是他一时算不出来已经有了几道题,他就萌萌地掰手指数. 这个时候他发现,虽然人们根据手指数创造了十进制数,但是两只手同时能表达的数是0-10一共十一个数字. 这样,他觉得如果用手指表现十进制数,同一个十进制数就会有很多种不同的表现方法. 比如,11

UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming&lt;Problem H&gt;

H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 邱老师长得帅这是人尽皆知,于是追他的妹子就会很多. 但是你知道,邱老师是一个很专一的人,所以他心里面只能有一个人. 于是他决定从追他的众多妹子里挑选一个出来.于是酱神给邱老师出来一个主意,已知有一些妹子,恰好可以给她们从l到r排号,使得每一个妹子有单独的数字,而正好有r-l+1个妹

UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming&lt;Problem F&gt;

F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一天邱老师心血来潮想去看电影,但是邱老师的妹子想去逛街,他们谁也没有办法说服对方,于是准备来玩一个游戏来决定听谁的. 邱老师找来w只白鼠和b只黑鼠,邱老师和妹子轮流从袋子里面抓老鼠,谁先抓到白色老鼠谁就赢. 但是有酱神在旁边捣乱,邱老师每抓一只老鼠出来,酱神就偷偷的也从里面抓一只出

UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming&lt;Problem G&gt;

G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 邱老师最近在玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中邱老师允许攻克M个城堡并获得里面的宝物. 但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡.你能帮邱老师算出要获得尽量多的宝物应该攻克哪M个城堡吗? In

UESTC_男神的约会 2015 UESTC Training for Dynamic Programming&lt;Problem J&gt;

J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 有一天男神约了学姐姐去看电影,电影院有一个活动,给你一个10*10的矩阵,每一个格子上都有一个0-9的整数,表示一共十种优惠券中的一种. 观众从左上角的格子开始走,走到右下角.每走到一个有着a号优惠券的格子,都必须要玩一个a分钟的游戏来领取这张优惠券. 每次只能向右或向下走.当走到右

UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming&lt;Problem M&gt;

M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 酱神要去一棵树上旅行. 酱神制定了一个旅行计划,他要按顺序去m个树上的结点,a1,a2,a3,...,am. 酱神有一辆车,树上的每一条边既可以开车通过,也可以走过去,两种方法需要不同的时间.如果选择走路,酱神需要先把车停在结点上,在他下一次要开车的时候,必须先回到停车的结点取车.

UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming&lt;Problem C&gt;

C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submit Status 酱神去杭州赏花. 花展在一条街道上举行,这条街道上有一共有n个节点,自左而右从1到n编号,1号和n号是左右两个端点,两个相邻端点之间的距离为1.本次花展一共要展出m朵花,在第ti时刻,有一朵颜值为bi的花将在第ai个节点展出,如果酱神在ti时刻处于第x个节点,那么他能获得的开心值为

UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming&lt;Problem L&gt;

L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 我们定义如下数列为菲波拉契数列: F(1)=1 F(2)=2 F(i)=F(i−1)+F(i−2)(i>=3) 给定任意一个数,我们可以把它表示成若干互不相同的菲波拉契数之和.比如13有三种表示法 13=13 13=5+8 13=2+3+8 现在给你一个数n,请输出把它表示成