package com.interview.dynamic;
/**
* Date 07/20/2015
* @author Tushar Roy
*
* Given a rod with markings. Cut the rod along markings but reduce the cost of cutting.
* Cost if cutting is proportional to the length of rod being cut.
*
* Solve is using top down dynamic programming. Memoize minimum cost of cutting between marking
* start to end. To calculate the value try all markings b/w start to end.
*
*/
public class CutRodToMinimizeCost {
public int cutRodToMinimizeCost(int [] markings, int total) {
int T[][] = new int[total+1][total+1];
for(int i = 0 ; i < T.length; i++) {
for(int j=0; j < T[i].length ; j++) {
T[i][j] = -1;
}
}
return cutRodToMinimizeCost(markings, 0, total, T);
}
private int cutRodToMinimizeCost(int[] markings, int start, int end, int T[][]){
if(T[start][end] != -1) {
return T[start][end];
}
int i;
for(i=0; i < markings.length; i++){
if(start < markings[i]) {
break;
}
}
if(i == markings.length) {
T[start][end] = 0;
return 0;
}
int j;
for(j=markings.length -1; j >= 0; j--){
if(end > markings[j]) {
break;
}
}
if(j == -1) {
T[start][end] = 0;
return 0;
}
if(i == j){
T[start][end] = end - start;
return end - start;
}
int cost = end - start;
int minCost = Integer.MAX_VALUE;
for(int k=i; k <= j; k++) {
int c1 = cutRodToMinimizeCost(markings, start, markings[k], T);
int c2 = cutRodToMinimizeCost(markings, markings[k], end, T);
if(c1 == Integer.MAX_VALUE || c2 == Integer.MAX_VALUE) {
continue;
}
if(minCost > c1 + c2){
minCost = c1 + c2;
}
}
if(minCost == Integer.MAX_VALUE) {
T[start][end] = Integer.MAX_VALUE;
return Integer.MAX_VALUE;
}
T[start][end] = cost + minCost;
return cost + minCost;
}
public static void main(String args[]) {
int markings[] = {2,3,6,7};
CutRodToMinimizeCost cr = new CutRodToMinimizeCost();
int cost = cr.cutRodToMinimizeCost(markings, 8);
System.out.println(cost);
}
}