/**
* Created by aditya on 11/10/16.
*/
class PublicTicketCost {
public static void main
(String args
[]){ int[] arr = {1,7,8,9,10,15,16,17,18,21,25};
int[] tDays = {1,7,30};
int[] tCost = {2,7,25};
System.
out.
println(minCost
(arr, tDays, tCost
)); }
public static int minCost(int[] arr, int[] tDays, int[] tCost) {
int[][] dp = new int[arr.length][tDays.length];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < tDays.length; j++) {
int prevDayIndex = findPrevDayIndex(arr,i,tDays,j);
int prevCost = prevDayIndex>=0 ? dp[prevDayIndex][tDays.length-1] : 0;
int currCost = prevCost + tCost[j];
if(j-1>=0){
currCost
= Math.
min(currCost, dp
[i
][j
-1]); }
dp[i][j] = currCost;
}
}
//print(dp);
return dp[arr.length-1][tDays.length-1];
}
private static void print(int arr[][]){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
System.
out.
print(arr
[i
][j
]+" "); }
}
}
private static int findPrevDayIndex(int[] arr, int i, int[] days, int j){
int validAfterDate = arr[i] - days[j];
if (validAfterDate<1){
return -1;
}
for (int k = i-1; k >= 0; k--) {
if (arr[k]<=validAfterDate){
return k;
}
}
return -1;
}
}
Ci8qKgogKiBDcmVhdGVkIGJ5IGFkaXR5YSBvbiAxMS8xMC8xNi4KICovCiAgICBjbGFzcyBQdWJsaWNUaWNrZXRDb3N0IHsKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKXsKICAgICAgICAgICAgaW50W10gYXJyICA9ICB7MSw3LDgsOSwxMCwxNSwxNiwxNywxOCwyMSwyNX07CiAgICAgICAgICAgIGludFtdIHREYXlzID0gezEsNywzMH07CiAgICAgICAgICAgIGludFtdIHRDb3N0ID0gezIsNywyNX07CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtaW5Db3N0KGFyciwgdERheXMsIHRDb3N0KSk7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IG1pbkNvc3QoaW50W10gYXJyLCBpbnRbXSB0RGF5cywgaW50W10gdENvc3QpIHsKICAgICAgICAgICAgaW50W11bXSBkcCA9IG5ldyBpbnRbYXJyLmxlbmd0aF1bdERheXMubGVuZ3RoXTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHREYXlzLmxlbmd0aDsgaisrKSB7CgogICAgICAgICAgICAgICAgICAgIGludCBwcmV2RGF5SW5kZXggPSBmaW5kUHJldkRheUluZGV4KGFycixpLHREYXlzLGopOwogICAgICAgICAgICAgICAgICAgIGludCBwcmV2Q29zdCA9IHByZXZEYXlJbmRleD49MCA/IGRwW3ByZXZEYXlJbmRleF1bdERheXMubGVuZ3RoLTFdIDogMDsKICAgICAgICAgICAgICAgICAgICBpbnQgY3VyckNvc3QgPSBwcmV2Q29zdCArIHRDb3N0W2pdOwogICAgICAgICAgICAgICAgICAgIGlmKGotMT49MCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJDb3N0ID0gTWF0aC5taW4oY3VyckNvc3QsIGRwW2ldW2otMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IGN1cnJDb3N0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vcHJpbnQoZHApOwogICAgICAgICAgICByZXR1cm4gZHBbYXJyLmxlbmd0aC0xXVt0RGF5cy5sZW5ndGgtMV07CiAgICAgICAgfQogICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoaW50IGFycltdW10pewogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhcnJbMF0ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGFycltpXVtqXSsiICIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRQcmV2RGF5SW5kZXgoaW50W10gYXJyLCBpbnQgaSwgaW50W10gZGF5cywgaW50IGopewogICAgICAgICAgICBpbnQgdmFsaWRBZnRlckRhdGUgPSBhcnJbaV0gLSBkYXlzW2pdOwogICAgICAgICAgICBpZiAodmFsaWRBZnRlckRhdGU8MSl7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgayA9IGktMTsgayA+PSAwOyBrLS0pIHsKICAgICAgICAgICAgICAgIGlmIChhcnJba108PXZhbGlkQWZ0ZXJEYXRlKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfQ==