Skip to content

Commit 9e61a02

Browse files
committed
commit
1 parent 252657e commit 9e61a02

File tree

21 files changed

+270
-2
lines changed

21 files changed

+270
-2
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package dynamicProgramming;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class DynamicProgramming {
7+
8+
9+
10+
/**
11+
* 打印输出最优解路径
12+
* @param p 长度对应的价格
13+
* @param n 长度
14+
*/
15+
public void printCutRodSolution(int[] p,int n){
16+
List list=extendedBottomUpCutRod(p, n);
17+
int[] s=(int[]) list.get(1);
18+
/* for (int i = 0; i < s.length; i++) {
19+
System.out.println(s[i]);
20+
}*/
21+
22+
while(n>0){
23+
if(s[n-1]==0)
24+
break;
25+
System.out.println(s[n-1]);
26+
n=n-s[n-1];
27+
}
28+
}
29+
/**
30+
* 重构解,保存最优解路径,而不只是打印最优解值
31+
* @param p 长度对应的价格数组
32+
* @param n 长度
33+
* @return 一个数组列表,里面存放的是两个数组,数组1为一个最优值,数组2为最有路径。
34+
*/
35+
public List extendedBottomUpCutRod(int[] p,int n){
36+
List list=new ArrayList<int[]>();
37+
int[] r=new int[n];
38+
int[] s=new int[n];
39+
r[0]=0;
40+
41+
for (int j = 0; j < r.length; j++) {
42+
int q=Integer.MIN_VALUE;
43+
for (int i = 0; i < j; i++) {
44+
if(q>p[i]+r[j-i]){
45+
q=q;
46+
}else{
47+
q=p[i]+r[j-i];
48+
s[j]=i;
49+
}
50+
}
51+
r[j]=q;
52+
}
53+
list.add(r[n-1]);
54+
list.add(s);
55+
return list;
56+
}
57+
58+
59+
/**
60+
* 自底向上使用动态规划求解最优值
61+
* @param p 输入的长度对应的价格数组
62+
* @param n 长度
63+
* @return 最高价格
64+
*/
65+
public int bottomUpCutRod(int[] p,int n){
66+
int[] r=new int[n];
67+
r[0]=0;
68+
for (int j = 0; j < r.length; j++) {
69+
int q=Integer.MIN_VALUE;
70+
for (int i = 0; i < j; i++) {
71+
if(q>p[i]+r[j-i]){
72+
q=q;
73+
}else{
74+
q=p[i]+r[j-i];
75+
}
76+
}
77+
r[j]=q;
78+
}
79+
return r[n-1];
80+
}
81+
82+
/**
83+
* 使用带备忘录的动态规划求解最优值
84+
* @param p长度对应的价格的数组
85+
* @param n 长度
86+
* @return 最优值
87+
*/
88+
public int memoizedCutRod(int[] p,int n){
89+
int[] r=new int[n];
90+
for (int i = 0; i < r.length; i++) {
91+
r[i]=Integer.MIN_VALUE;
92+
}
93+
return memoizedCutRodAux(p,n,r);
94+
}
95+
/**
96+
* 带备忘录的动态规划算法的辅助函数
97+
* @param p 长度对应的价格的数组
98+
* @param n 长度
99+
* @param r 新数组,作为备忘录,存放以前阶段的最优值
100+
* @return
101+
*/
102+
private int memoizedCutRodAux(int[] p, int n, int[] r) {
103+
// TODO Auto-generated method stub
104+
int q;
105+
if(r[n-1]>=0){
106+
return r[n-1];
107+
}
108+
if(n-1==0){
109+
q=0;
110+
}else{
111+
q=Integer.MIN_VALUE;
112+
for (int i = 1; i <n; i++) {
113+
if(p[i]+memoizedCutRodAux(p, n-i, r)>q){
114+
q=p[i]+memoizedCutRodAux(p, n-i, r);
115+
}else{
116+
q=q;
117+
}
118+
}
119+
}
120+
r[n-1]=q;
121+
return q;
122+
}
123+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package dynamicProgramming;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class DynamicProgramming {
7+
8+
9+
10+
/**
11+
* 打印输出最优解路径
12+
* @param p 长度对应的价格
13+
* @param n 长度
14+
*/
15+
public void printCutRodSolution(int[] p,int n){
16+
List list=extendedBottomUpCutRod(p, n);
17+
int[] s=(int[]) list.get(1);
18+
/* for (int i = 0; i < s.length; i++) {
19+
System.out.println(s[i]);
20+
}*/
21+
22+
while(n>0){
23+
if(s[n-1]==0)
24+
break;
25+
System.out.println(s[n-1]);
26+
n=n-s[n-1];
27+
}
28+
}
29+
/**
30+
* 重构解,保存最优解路径,而不只是打印最优解值
31+
* @param p 长度对应的价格数组
32+
* @param n 长度
33+
* @return 一个数组列表,里面存放的是两个数组,数组1为一个最优值,数组2为最有路径。
34+
*/
35+
public List extendedBottomUpCutRod(int[] p,int n){
36+
List list=new ArrayList<int[]>();
37+
int[] r=new int[n];
38+
int[] s=new int[n];
39+
r[0]=0;
40+
41+
for (int j = 0; j < r.length; j++) {
42+
int q=Integer.MIN_VALUE;
43+
for (int i = 0; i < j; i++) {
44+
if(q>p[i]+r[j-i]){
45+
q=q;
46+
}else{
47+
q=p[i]+r[j-i];
48+
s[j]=i;
49+
}
50+
}
51+
r[j]=q;
52+
}
53+
list.add(r[n-1]);
54+
list.add(s);
55+
return list;
56+
}
57+
58+
59+
/**
60+
* 自底向上使用动态规划求解最优值,自底向上主要用一个数组标记着较小问题的解,从小到大依次求解
61+
* @param p 输入的长度对应的价格数组
62+
* @param n 长度
63+
* @return 最高价格
64+
*/
65+
public int bottomUpCutRod(int[] p,int n){
66+
int[] r=new int[n];
67+
r[0]=0;
68+
for (int j = 0; j < r.length; j++) {
69+
int q=Integer.MIN_VALUE;
70+
for (int i = 0; i < j; i++) {
71+
if(q>p[i]+r[j-i]){
72+
q=q;
73+
}else{
74+
q=p[i]+r[j-i];
75+
}
76+
}
77+
r[j]=q;
78+
}
79+
return r[n-1];
80+
}
81+
82+
/**
83+
* 使用带备忘录的动态规划求解最优值,带有备忘录的算法使用递归算法,但是较小问题的解用备忘录记录下来了
84+
* @param p长度对应的价格的数组
85+
* @param n 长度
86+
* @return 最优值
87+
*/
88+
public int memoizedCutRod(int[] p,int n){
89+
int[] r=new int[n];
90+
for (int i = 0; i < r.length; i++) {
91+
r[i]=Integer.MIN_VALUE;
92+
}
93+
return memoizedCutRodAux(p,n,r);
94+
}
95+
/**
96+
* 带备忘录的动态规划算法的辅助函数
97+
* @param p 长度对应的价格的数组
98+
* @param n 长度
99+
* @param r 新数组,作为备忘录,存放以前阶段的最优值
100+
* @return
101+
*/
102+
private int memoizedCutRodAux(int[] p, int n, int[] r) {
103+
// TODO Auto-generated method stub
104+
int q;
105+
if(r[n-1]>=0){
106+
return r[n-1];
107+
}
108+
if(n-1==0){
109+
q=0;
110+
}else{
111+
q=Integer.MIN_VALUE;
112+
for (int i = 1; i <n; i++) {
113+
if(p[i]+memoizedCutRodAux(p, n-i, r)>q){
114+
q=p[i]+memoizedCutRodAux(p, n-i, r);
115+
}else{
116+
q=q;
117+
}
118+
}
119+
}
120+
r[n-1]=q;
121+
return q;
122+
}
123+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package dynamicProgramming;
2+
3+
public class TestDynamicProgramming {
4+
/**
5+
* 动态规划可以用来求带有重复子问题的最优解等问题。
6+
* 测试动态规划的java类
7+
* int[] p 长度对应的价格数组
8+
* n 钢条长度,这个长度和真正的类中的长度不相同,因为java数组的角标从0开始等。
9+
* @param args
10+
*/
11+
public static void main(String[] args) {
12+
int[] p={0,1,5,8,9,10,17,17,20,24,30};
13+
int n=9; //输入的n,实际为n-1 ; 因为java角标是从0开始的
14+
DynamicProgramming dp=new DynamicProgramming();
15+
// int maxProce=dp.memoizedCutRod(p, n+1);
16+
// int maxPrice=dp.bottomUpCutRod(p, n+2); //两个for循环嵌套
17+
// System.out.println(maxPrice);
18+
dp.printCutRodSolution(p, n+2);
19+
}
20+
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)