题目链接:https://codeforces.com/contest/31/problem/E
思路来自洛谷@Binary_Search_Tree
dp[i][j]表示第i位到第n位中A选了j位的最大A+B
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <climits> #include <cstring> #include <vector> #include <string> #include <queue> #include <stack> #include <deque> #include <set> #include <map> #include <bitset> #include <unordered_set> #include <unordered_map> #include <algorithm> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define lowbit(x) (x & (-x)) #define CASET int _; scanf("%d", &_); for(int kase=1;kase<=_;kase++) typedef double db; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; static const int INF=0x3f3f3f3f; static const ll INFL=0x3f3f3f3f3f3f3f3f; static const db EPS=1e-10; static const db PI=acos(-1.0); static const int MOD=1e9+7; template <typename T> inline void read(T &f) { f = 0; T fu = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); } while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); } f *= fu; } template <typename T> void print(T x) { if (x < 0) putchar('-'), x = -x; if (x < 10) putchar(x + 48); else print(x / 10), putchar(x % 10 + 48); } static const int MAXN=18*2+5; int n; char s[MAXN]; ull dp[MAXN][MAXN]; ull p[MAXN]; void dfs(int i,int j) { if(i>2*n) return; if(j && dp[i+1][j-1]+p[j-1]*(s[i]-'0')==dp[i][j]) { putchar('H'); dfs(i+1,j-1); } else { putchar('M'); dfs(i+1,j); } } int main() { scanf("%d%s",&n,s+1); p[0]=1; for(int i=1;i<=18;i++) p[i]=p[i-1]*10; ull ans=0; for(int i=2*n;i>=1;i--) { for(int j=0;j<=2*n-i+1;j++) { int k=2*n-i+1-j; if(j) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+p[j-1]*(s[i]-'0')); if(k) dp[i][j]=max(dp[i][j],dp[i+1][j]+p[k-1]*(s[i]-'0')); } } dfs(1,n); return 0; }
最后
以上就是霸气苗条最近收集整理的关于CodeForces - 31E TV Game【DP】的全部内容,更多相关CodeForces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复