/**
* you have a collection of N wines placed next to each other on a shelf. For
* simplicity, let's number the wines from left to right as they are standing on
* the shelf with integers from 1 to N, respectively. The price of the i-th wine
* is pi (prices of different wines can be different).
* Because the wines get better every year, supposing today is the year 1, on
* year y the price of the i-th wine will be y*pi, i.e. y-times more than the
* current year.
* what is the maximum profit you can get, if you sell the wines in optimal order.
* So for example, if the prices of the wines are (in the order as they are
* placed on the shelf, from left to right): p1=1, p2=4, p3=2, p4=3.
*
*/
public class DP1 {
int p[] = null;
int cache[][];
public DP1(){
p = new int[100];
cache = new int[100][100];
for(int i=0; i<100; i++)
for(int j=0; j<100; j++)
cache[i][j] = -1;
}
public DP1(int N){
p = new int[N];
cache = new int[N][N];
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
cache[i][j] = -1;
}
/**
* Description: Backtracking function to find maximum profit.
* @param year : starts from 1 to N-1
* @param be : beginning of price array
* @param en : end of price array
* @return : maximized profit
*/
public int maxProfit(int year, int be, int en){
if(be>en)
return 0;
return Math.max((this.maxProfit(year+1, be+1, en)+year*this.p[be]),(this.maxProfit(year+1, be, en-1) + year*p[en]));
}
/*
* Dynamic Programming Approach
*/
public int maxDPProfit(int be, int en){
if(be > en)
return 0;
if(cache[be][en] != -1)
return cache[be][en];
int year = this.p.length - (en-be+1) + 1;
cache[be][en] = Math.max((this.maxDPProfit(be+1, en) + year*p[be]),(this.maxDPProfit(be, en-1)+year*p[en]));
return cache[be][en];
}
public static void main(String args[]){
DP1 dp = new DP1();
int p[] = new int[]{1,4,2,3};
dp.p = p;
int profit = dp.maxProfit(1, 0, 3);
System.out.println("Profit: " + profit);
//DP
int dpprofit = dp.maxDPProfit(0, 3);
System.out.println("DP Profit: " + dpprofit);
}
}
* you have a collection of N wines placed next to each other on a shelf. For
* simplicity, let's number the wines from left to right as they are standing on
* the shelf with integers from 1 to N, respectively. The price of the i-th wine
* is pi (prices of different wines can be different).
* Because the wines get better every year, supposing today is the year 1, on
* year y the price of the i-th wine will be y*pi, i.e. y-times more than the
* current year.
* what is the maximum profit you can get, if you sell the wines in optimal order.
* So for example, if the prices of the wines are (in the order as they are
* placed on the shelf, from left to right): p1=1, p2=4, p3=2, p4=3.
*
*/
public class DP1 {
int p[] = null;
int cache[][];
public DP1(){
p = new int[100];
cache = new int[100][100];
for(int i=0; i<100; i++)
for(int j=0; j<100; j++)
cache[i][j] = -1;
}
public DP1(int N){
p = new int[N];
cache = new int[N][N];
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
cache[i][j] = -1;
}
/**
* Description: Backtracking function to find maximum profit.
* @param year : starts from 1 to N-1
* @param be : beginning of price array
* @param en : end of price array
* @return : maximized profit
*/
public int maxProfit(int year, int be, int en){
if(be>en)
return 0;
return Math.max((this.maxProfit(year+1, be+1, en)+year*this.p[be]),(this.maxProfit(year+1, be, en-1) + year*p[en]));
}
/*
* Dynamic Programming Approach
*/
public int maxDPProfit(int be, int en){
if(be > en)
return 0;
if(cache[be][en] != -1)
return cache[be][en];
int year = this.p.length - (en-be+1) + 1;
cache[be][en] = Math.max((this.maxDPProfit(be+1, en) + year*p[be]),(this.maxDPProfit(be, en-1)+year*p[en]));
return cache[be][en];
}
public static void main(String args[]){
DP1 dp = new DP1();
int p[] = new int[]{1,4,2,3};
dp.p = p;
int profit = dp.maxProfit(1, 0, 3);
System.out.println("Profit: " + profit);
//DP
int dpprofit = dp.maxDPProfit(0, 3);
System.out.println("DP Profit: " + dpprofit);
}
}
#output:
Profit: 29
DP Profit: 29
can you provide a bottom up DP solution for the above problem?
ReplyDelete