阿里笔试7.29解法
2.n 个客栈依次排列,给出 n - 1 条路的权重。从任意一处出发,每走过一条路,该路的权重减 1,但得到 1 点利益。不能走权重为 0 的路。求最大利益。
解法代码
import java.util.*; public class Main{ public static void main(String[] args) { List<Integer> line = new LinkedList(Arrays.asList(5,2,4)); Map<String,Integer> dp = new HashMap<>(); Integer maxValue = -1; for(int i = 0;i < line.size() + 1;++i){ List<Integer> lineTmp = new LinkedList<>(line); String key = toStringKey(lineTmp,i); dp.put(key,0); } while(!dp.isEmpty()){ Map<String,Integer> preDp = dp; dp = new HashMap<>(); for(Map.Entry<String,Integer> entry : preDp.entrySet()){ String key = entry.getKey(); List<Integer> tmpLine = getLineFromKey(key); Integer tmpIndex = getNodeIndexFromKey(key); Integer tmpVal = entry.getValue(); if(tmpIndex == tmpLine.size()){ Integer lineSize = tmpLine.get(tmpIndex - 1); if(lineSize > 0){ tmpLine.set(tmpIndex - 1,lineSize - 1); tmpVal += 1; tmpIndex -= 1; String tmpKey = toStringKey(tmpLine,tmpIndex); if(dp.containsKey(tmpKey)){ dp.put(tmpKey,Math.max(dp.get(tmpKey),tmpVal)); maxValue = Math.max(tmpVal,maxValue); }else{ dp.put(tmpKey,tmpVal); maxValue = Math.max(tmpVal,maxValue); } } }else if(tmpIndex == 0){ Integer lineSize = tmpLine.get(tmpIndex); if(lineSize > 0){ tmpLine.set(tmpIndex,lineSize - 1); tmpVal += 1; tmpIndex += 1; String tmpKey = toStringKey(tmpLine,tmpIndex); if(dp.containsKey(tmpKey)){ dp.put(tmpKey,Math.max(dp.get(tmpKey),tmpVal)); maxValue = Math.max(tmpVal,maxValue); }else{ dp.put(tmpKey,tmpVal); maxValue = Math.max(tmpVal,maxValue); } } }else{ Integer lineSize1 = tmpLine.get(tmpIndex); Integer lineSize2 = tmpLine.get(tmpIndex - 1); if(lineSize1 > 0){ tmpLine.set(tmpIndex,lineSize1 - 1); tmpVal += 1; tmpIndex += 1; String tmpKey = toStringKey(tmpLine,tmpIndex); if(dp.containsKey(tmpKey)){ dp.put(tmpKey,Math.max(dp.get(tmpKey),tmpVal)); maxValue = Math.max(tmpVal,maxValue); }else{ dp.put(tmpKey,tmpVal); maxValue = Math.max(tmpVal,maxValue); } tmpIndex -= 1; tmpVal -= 1; tmpLine.set(tmpIndex,lineSize1); } if(lineSize2 > 0){ tmpLine.set(tmpIndex - 1,lineSize2 - 1); tmpVal += 1; tmpIndex -= 1; String tmpKey = toStringKey(tmpLine,tmpIndex); if(dp.containsKey(tmpKey)){ dp.put(tmpKey,Math.max(dp.get(tmpKey),tmpVal)); maxValue = Math.max(tmpVal,maxValue); }else{ dp.put(tmpKey,tmpVal); maxValue = Math.max(tmpVal,maxValue); } } } } } System.out.println(maxValue); } public static String toStringKey(List<Integer> line,Integer index){ StringBuilder sb = new StringBuilder(); for(Integer i : line){ sb.append(i).append(":"); } sb.append(index); return sb.toString(); } public static List<Integer> getLineFromKey(String key){ String[] lineAndIndex = key.split(":"); List<Integer> data = new LinkedList<>(); for(int i = 0;i < lineAndIndex.length - 1;++i){ data.add(Integer.parseInt(lineAndIndex[i])); } return data; } public static Integer getNodeIndexFromKey(String key){ String[] lineAndIndex = key.split(":"); return Integer.parseInt(lineAndIndex[lineAndIndex.length - 1]); } }