第一题:P1470 [USACO2.3]最长前缀 Longest Prefix - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个题的题目还没看懂
第二题:P2858 [USACO06FEB]Treats for the Cows G/S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
package 蓝桥算法训练__普及组.Day13;
import java.io.*;
/**
* @author snippet
* @data 2023-02-17
* P2858 [USACO06FEB]Treats for the Cows G/S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
*/
// 区间DP
public class T2 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static int n;// n表示零食的个数
static int[] val = new int[2020];// 数组val表示第i份零食的初始价值
static int[][] dp = new int[2020][2020];// 二维数组dp表示第i-j份零食的最大价值
public static void main(String[] args) throws IOException {
n = nextInt();
for (int i = 1; i <= n; i++) {
val[i] = nextInt();
}
for (int len = 1; len <= n; len++) {// 先枚举区间长度
for (int i = 1; (i+len-1) <= n; i++) {// 在枚举区间的开头
int j = i+len-1;// 求出区间的结尾
// 在推出dp的状态转移式
// Math.max(dp[i+1,j]加上这天销售i的价值,dp[i,j-1]加上这天销售j的价值)
dp[i][j] = Math.max(dp[i+1][j]+val[i]*(n-len+1), dp[i][j-1]+val[j]*(n-len+1));
}
}
pw.println(dp[1][n]);
pw.flush();
}
static int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
}

第三题:P1091 [NOIP2004 提高组] 合唱队形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
package 蓝桥算法训练__普及组.Day13;
import java.io.*;
/**
* @author snippet
* @data 2023-02-17
* P1091 [NOIP2004 提高组] 合唱队形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
*/
// 动态规划
public class T3 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static int n,max=0;// n存学生的个数 max存最大的留下来的学生的个数
static int[] t = new int[110];// t数组存每个学生的身高
static int[] up = new int[110];// up数组存[1->i]身高升序的学生的个数
static int[] down = new int[110];// down数组存[i->n]身高降序的学生的个数
public static void main(String[] args) throws IOException {
n = nextInt();
for (int i = 1; i <= n; i++) {
t[i] = nextInt();
// 初始化 把自己先算上去
up[i] = 1;
down[i] = 1;
}
// 左边升序
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
if (t[j] < t[i] && up[i] <= up[j]) {
up[i] = up[j]+1;
}
}
}
// 右边降序
for (int i = n-1; i >= 1; i--) {
for (int j = i+1; j <= n; j++) {
if (t[i] > t[j] && down[i] <= down[j]) {
down[i] = down[j]+1;
}
}
}
// 求最大的排队的人数
for (int i = 1; i <= n; i++) {
max = Math.max(max, up[i]+down[i]-1);
}
pw.println(n-max);
pw.flush();
}
static int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
}
