【CF 189A Cut Ribbon】dp

简介: 题目链接:http://codeforces.com/problemset/problem/189/A 题意:一个长度为n的纸带,允许切割若干次,每次切下的长度只能是{a, b, c}之一。问最多能切成多少块。

题目链接:http://codeforces.com/problemset/problem/189/A

题意:一个长度为n的纸带,允许切割若干次,每次切下的长度只能是{a, b, c}之一。问最多能切成多少块。

思路:动态规划,记dp[i] 为当前已经切下总长度 i 时最多能切成的块数,即规模为 i 的子问题。

状态的转移比较好想,每次只可能从dp[i-a], dp[i-b], dp[i-c]三个方向通过加一转移过来。

问题的初始化我考虑得有点复杂:先把a, b, c从小到大排序,然后对于 i 属于[0, a), [a, b), [b, c]三个区间按顺序初始化dp[i]:判断 i 能否分解成{a}, {a, b}, {a, b, c}的“线性组合”,可以的话取系数和最大的那个作为dp[i]。

初始化之后就是线性的从[c, n]的枚举,每次取三个转移方向中最优的那个。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <string>
 5 #include <cstdlib>
 6 #include <cctype>
 7 #include <cmath>
 8 #include <algorithm>
 9 #include <vector>
10 #include <map>
11 #include <set>
12 #include <stack>
13 #include <queue>
14 #include <assert.h>
15 #define FREAD(fn) freopen((fn), "r", stdin)
16 #define RINT(vn) scanf("%d", &(vn))
17 #define PINT(vb) printf("%d", vb)
18 #define RSTR(vn) scanf("%s", (vn))
19 #define PSTR(vn) printf("%s", (vn))
20 #define CLEAR(A, X) memset(A, X, sizeof(A))
21 #define REP(N) for(i=0; i<(N); i++)
22 #define REPE(N) for(i=1; i<=(N); i++)
23 #define pb(X) push_back(X)
24 #define pn() printf("\n")
25 using namespace std;
26 const int MAX_N = 4005;
27 int i, j;
28 int n, a, b, c;
29 int dp[MAX_N];//dp[i]=总长度为i时能切成的最大块数
30 
31 int main()
32 {
33     CLEAR(dp, 0);
34     RINT(n);
35     RINT(a); RINT(b); RINT(c);
36     if(a > b) swap(a, b);
37     if(b > c) swap(b, c);
38     for(i=0; i<a; i++)
39         dp[i] = 0;
40     for(i=a; i<b; i++){
41         if(i % a == 0) dp[i] = i/a;
42         else dp[i] = 0;
43     }
44     for(i=b; i<=c; i++){
45         if(i % a == 0){
46             dp[i] = i/a;
47             continue;
48         }
49         else{
50             bool flag = 0;
51             for(j=0; j*a < i; j++){
52                 if((i-j*a) % b == 0){
53                     flag = 1;
54                     dp[i] = max(dp[i], j + (i-j*a)/b);
55                 }
56             }
57             if(flag) continue;
58         }
59         if(i % b == 0) dp[i] = max(dp[i], i/b);
60         else if(i == c) dp[i] = max(dp[i], 1);
61         else dp[i] = 0;
62     }
63     //printf("dp[%d] = %d\n", b, dp[b]);
64     for(i=c; i<=n; i++){
65         if(dp[i-a] > 0) 
66             dp[i] = max(dp[i], dp[i-a] + 1);
67         if(dp[i-b] > 0)
68             dp[i] = max(dp[i], dp[i-b] + 1);
69         if(dp[i-c] > 0)
70             dp[i] = max(dp[i], dp[i-c] + 1);
71     }
72     // REP(n) 
73     //     printf("dp[%d]  = %d\n", i, dp[i]);
74     PINT(dp[n]);
75     return 0;
76 }

 

目录
相关文章
|
机器学习/深度学习
CF189A Cut Ribbon(dp一维思想,完全背包最详细解析)
CF189A Cut Ribbon(dp一维思想,完全背包最详细解析)
87 0
|
7月前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
107 0
|
1月前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
61 15
|
1月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
80 5
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
108 13
|
6月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
6月前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
242 3
|
7月前
|
负载均衡 算法
SpringCloud&Ribbon负载均衡原理与实践
SpringCloud&Ribbon负载均衡原理与实践
84 3
|
7月前
|
负载均衡
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
91 0