UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>
2015-05-29 23:35
471 查看
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<=10Output
每组数据输出占一行,为一个整数,表示剩下的妹子的个数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; }
相关文章推荐
- UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
- UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>
- UESTC_菲波拉契数制 2015 UESTC Training for Dynamic Programming<Problem E>
- UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
- UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming<Problem B>
- UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>
- Devexpress VCL Build v2014 vol 14.2.7发布
- CF 546C(Soldier and Cards-deque)
- VC6.0 The value of ESP was not properly saved across a function call 错误解决方法
- UE4简单AI
- Joshua Bloch错了? ——适当改变你的Builder模式实现
- Design and Analysis of Algorithms_Divide-and-Conquer
- <游戏开发>UI编辑器_Idea
- UI效果
- HDU3304 POJ3146 Interesting Yang Hui Triangle Lucas定理
- 玩转Light Blue之添加设备信息
- UITableView的tableHeaderView和viewForHeaderInSection區別
- 5.UI线程和非UI线程的交互方式