我是靠谱客的博主 神勇刺猬,这篇文章主要介绍CodeForces 349B Color the Fence (dp),现在分享给大家,希望可以做个参考。

题意:

给出1~9数字对应的费用以及一定的费用,让你输出所选的数字所能组合出的最大的数值。


思路:

dp

一开始想歪了(sort并不对= =)。

dp[i]:费用为i时,最大所能得到的数字个数。

par[i]:记录当前i的状态是由前面哪个状态转移来的。

path[i]:记录费用到i时,所选的数字。

输出方案时,根据par数组从n往回跳,直到为0。途中把path中的数字记录个数。后面从大到小输出数字即可。


code:

复制代码
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
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6+5; int v; int a[15]; int dp[MAXN], path[MAXN], par[MAXN]; //path:记录当前点选的数值,par:记录我应该怎么跳; int cnt[15]; int main() { cin>>v; for(int i = 1;i <= 9; i++) scanf("%d", a+i); // for(int i = 1;i <= v; i++) { for(int j = 1;j <= 9; j++) { if(i < a[j]) continue; int tmp = dp[i-a[j]]+1; if(dp[i] < tmp || (dp[i]==tmp && path[i] < j)) { dp[i] = tmp; path[i] = j; par[i] = i-a[j]; } } if(dp[i] < dp[i-1]) { dp[i] = dp[i-1]; par[i] = i-1; path[i] = 0; } } if(dp[v] == 0) { puts("-1"); return 0; } int idx = v; while(idx != 0) { cnt[path[idx]]++; idx = par[idx]; } for(int i = 9;i >= 1; i--) { while(cnt[i]--) printf("%d", i); } puts(""); return 0; }


最后

以上就是神勇刺猬最近收集整理的关于CodeForces 349B Color the Fence (dp)的全部内容,更多相关CodeForces内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部