UVALive 4004 Space Beacon
2013-03-27 19:01
363 查看
先DP预处理出以i开头、长度为j、先升/降(0/1)的序列的个数:d[i][j][0/1]。再数给出的串是第几个串。
// 4004 Space Beacon Accepted C++ 0.009 2013-03-27 10:52:06 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; const int MAXN = 18+5; int T, a[MAXN]; long long d[10][MAXN][2]; char s[1<<10]; int main() { for (int i = 1; i <= 9; i++) { d[i][1][0] = d[i][1][1] = 1; d[i][2][0] = 9-i; d[i][2][1] = i-1; } for (int j = 3; j <= 18; j++) for (int i = 1; i <= 9; i++) { for (int k = i+1; k <= 9; k++) d[i][j][0] += d[k][j-1][1]; for (int k = 1; k < i; k++) d[i][j][1] += d[k][j-1][0]; } scanf("%d",&T); gets(s); while (T--) { gets(s); int n = 0; for (int i = 0; s[i]; i++) if (isdigit(s[i])) a[n++] = s[i]-'0'; long long ans = 0; for (int i = 0; i < n; i++) { for (int j = 1; j < a[i]; j++) for (int k = max(3-i, 1); k <= 18-i; k++) { if (!i) ans += d[j][k][0]+d[j][k][1]; else if ((i == 1 && j != a[i-1]) || (i > 1 && ((a[i-2] > a[i-1] && a[i-1] < j) || (a[i-2] < a[i-1] && a[i-1] > j)))) ans += d[j][k][a[i-1] > j ? 0 : 1]; } if (i >= 3) ans++; } printf("%lld\n", ++ans); } return 0; }
相关文章推荐
- UVALIVE 4004
- UVALIVE 4004
- UVALive 6910 Cutting Tree(并查集)
- UVALive 3983 Robotruck (单调队列,dp)
- 指南 第三章 例题5 UVALive 3644 X-Plosives(并查集)
- POJ1555 ZOJ1720 UVA392 UVALive5309 Polynomial Showdown题解
- UVALive 6181
- 2006 Asia - Kaohsiung Perfect Service 树形DP (uvaLive3685) ★
- UVALive 4854 A Digital Satire of Digital Age
- UVa Live-3357 Pinary(斐波那契+找规律)
- UVALive 7147 思维题(贪心)
- UVALive 3305 Tour(DP)
- UVa Live Archive 2322 - Wooden Sticks
- Exploring Pyramids UVALive - 3516 题解
- UVALive 3523 圆桌骑士
- Repeated Substrings(UVAlive 6869)
- UvaLive-4287-Proving Equivalences
- UVALive - 5097 Cross the Wall(斜率优化)
- UVALive - 4256 || LA 4256 Salesmen 商人(DP)
- UVALive 5097 斜率DP