Timus 1900 Brainwashing Device

import java.io.*;
import java.math.BigInteger;
import java.util.*;
 
public class Main {
    public static void backtrack(int last[][], String result, int i, int j){
        if(last[i][j]==0){
            result+=" "+i;
            System.out.println(result.trim());
            return;
        }else if(last[i][j]==-1){
            backtrack(last, result, i-1, j);
        }else{
            backtrack(last, result+" "+i, last[i][j], j-1);
        }
    }
    public static void main (String [] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int k = scan.nextInt();
        int arr[][] = new int[n][n];
        int arr2[][] = new int[n][n];
        for(int i=1;i=i;t--){
                    arr2[i][t] += arr[i][j];
                }
                arr2[i][j] += arr2[i-1][j];
            }
        }
        int dp[][] = new int[n][k+1];
        int last[][] = new int[n][k+1];
        for(int i=1;i=j-1;m--){
                    if(dp[m][j-1]+arr2[i][i]-arr2[m][i]>=t2){
                        t2 = dp[m][j-1]+arr2[i][i]-arr2[m][i];
                        pos = m;
                    }
                }
                if(t1>t2){
                    dp[i][j] = t1;
                }else{
                    dp[i][j] = t2;
                    last[i][j] = pos;
                }
            }
        }
        System.out.println(dp[n-1][k]);
        backtrack(last, "", n-1, k);
    }
}

一个DP题,假设前N-1个站有K个洗脑机的最优解已经知道,表示为DP[n-1][k], 那么考虑第N 个站点;

两种情况,1. 这个点不放洗脑机,也就是不在最后结果里, 那么dp[n][k] = dp[n-1][k];
2. 如果放洗脑机,那么 dp[n][k] 的值需要遍历所有的 dp[m][k-1],  j-1<=m

dp[m][k-1]的值加上由于引进第N个点而需要补充的值, 取最大和上一种情况比较。有点抽象

最后还是回溯路径。1Y,不错。

你可能感兴趣的:(Timus)