您的位置:首页 > 大数据 > 人工智能

Timus 1900 Brainwashing Device

2013-12-26 17:27 405 查看
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

;
int arr2[][] = new int

;
for(int i=1;i<n;i++){
for(int j=i;j<n;j++){
arr[i][j] = scan.nextInt();
for(int t=j;t>=i;t--){
arr2[i][t] += arr[i][j];
}
arr2[i][j] += arr2[i-1][j];
}
}
int dp[][] = new int
[k+1];
int last[][] = new int
[k+1];
for(int i=1;i<n;i++){
Arrays.fill(last[i], -1);
for(int j=1;j<=Math.min(i, k);j++){
int t1 = dp[i-1][j];
int t2 = 0;
int pos = 1;
for(int m=i-1;m>=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
[k] = dp[n-1][k];

2. 如果放洗脑机,那么 dp
[k] 的值需要遍历所有的 dp[m][k-1], j-1<=m<n;

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

最后还是回溯路径。1Y,不错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: