Codeforces - 189A - Cur Ribbon
题目大意
给你一段 n
长度的绳子,要你剪断它,但是剪出来的段只能是 a
、 b
、 c
三种长度,问你最多可以剪多少段。
解析
简单的 dp
: 当前的 dp[n]
是前面已经剪出来的最大值加上自己的。
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int a, b, c;
static int[] dp;
static int cal(int n){
if(n < 0) //should be care
return Integer.MIN_VALUE;
if(n == 0)
return 0;
if(dp[n] != -1)
return dp[n];
dp[n] = Math.max(cal(n-a), Math.max(cal(n-b), cal(n-c)))+1;
return dp[n];
}
public static void main(String[] args){
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int n = cin.nextInt();
a = cin.nextInt();
b = cin.nextInt();
c = cin.nextInt();
dp = new int[n+1];
Arrays.fill(dp, -1);
System.out.println(cal(n));
}
}
不用记忆化的写法:
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int n = cin.nextInt();
int a = cin.nextInt();
int b = cin.nextInt();
int c = cin.nextInt();
int[] dp = new int[n+1];
dp[0] = 0;
for(int i = 1; i <= n; i++){
int max = Integer.MIN_VALUE;
if(i - a >= 0)
max = Math.max(max, dp[i-a]);
if(i - b >= 0)
max = Math.max(max, dp[i-b]);
if(i - c >= 0)
max = Math.max(max, dp[i-c]);
dp[i] = max + 1;
}
System.out.println(dp[n]);
}
}
题目链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论