Skip to content

Commit 04f4202

Browse files
committed
commit
1 parent 5c98288 commit 04f4202

File tree

47 files changed

+1980
-4
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

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

0 commit comments

Comments
 (0)