1. 美丽的项链(动态规划)
1. 题目描述
/**
妞妞参加了Nowcoder Girl女生编程挑战赛, 但是很遗憾, 她没能得到她最喜欢的黑天鹅水晶项链。
于是妞妞决定自己来制作一条美丽的项链。一条美丽的项链需要满足以下条件:
1、需要使用n种特定的水晶宝珠
2、第i种水晶宝珠的数量不能少于li颗, 也不能多于ri颗
3、一条美丽的项链由m颗宝珠组成
妞妞意识到满足条件的项链种数可能会很多, 所以希望你来帮助她计算一共有多少种制作美丽的项链的方案。
输入:
3 5
0 3
0 3
0 3
输出
12
*/
2. 代码
二维数组dp[i][j],表示用i+1种宝石选择j个宝石的方案
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][]limit = new int[n][2];
for(int i=0; i<n;i++){
limit[i][0] = sc.nextInt();
limit[i][1] = sc.nextInt();
}
long[][]dp = new long[n][m+1];
for (int i = 0; i < m+1; i++) {
if(i>=limit[0][0] && i<=limit[0][1]){
dp[0][i]=1;
}
}
for (int i = 0; i < n; i++) {
if(limit[i][0] <=0){
dp[i][0]=1;
}
}
for (int i = 1; i <n; i++) {
for (int j = 1; j < m+1; j++) {
dp[i][j] = 0;
for (int j2 = 0; j2 <= j; j2++) {
if(j2+limit[i][1]>=j && limit[i][0]+j2<=j){
dp[i][j] += dp[i-1][j2];
}
}
}
}
System.out.println(dp[n-1][m]);
}
}
2.多线程并发交替输出
1. 题目描述
/** 创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D 依次类推 */
2. 代码
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
new Thread(new Runnable(){
@Override
public void run() {
try {
lock.lock();
for (int i = 1; i <= 52; i++) {
System.out.print(i);
if(i%2==0){
c1.signalAll();
c2.await();
}
}
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
try {
lock.lock();
for (int i = 0; i < 26; i++) {
System.out.print((char)('A'+i)+" ");
c2.signalAll();
if(i!=25){
c1.await();
}
}
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
}
}
}).start();
}
}