用户调度问题
用户调度问题
在通信系统中有一个常见的问题是对用户进行不同策略的调度 会得到不同系统消耗的性能 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略 不同的策略会消耗不同的系统资源 请你根据如下规则进行用户调度 并返回总的消耗资源数 规则是:相邻的用户不能使用相同的调度策略
例如: 第一个用户使用A策略 则第二个用户只能使用B和C策略 对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值 例如 某用户分别使用ABC策略的系统消耗,分别为15 8 17 每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优 如果有多个满足要求的策略,选最后一个
输入描述:
- 第一行表示用户个数N
- 接下来表示每一行表示一个用户分别使用三个策略的资源消耗 resA resB resC
输出描述: 最优策略组合下的总的系统消耗资源数
看网上仅有的答案是贪心方式的,场景考虑不全。DP写了下,自己验了几组数据,不知道是否AC的,仅供参考:
public class 任务调度问题2_动态规划思路 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int userNum = sc.nextInt();
int[][] res = new int[userNum][3];
for(int i=0;i<userNum;i++) {
for(int j=0;j<3;j++) {
res[i][j] = sc.nextInt();
}
}
jobDispatch(res,userNum);
}
sc.close();
}
public static void jobDispatch(int[][] res,int userNum) {
// 使用二维数组保存状态:每个维度的含义分别是:[当前用户ID][所选的任务策略:A为0、B为1,、C为2],默认从下标1开始,所以是4
int[][] dp = new int[userNum+1][4];
for(int[] temp : dp) {
Arrays.fill(temp,Integer.MAX_VALUE);
}
// result用来存放不同用户数量时的最小结果:比如result[0]就是只有一个用户时的最小消耗
int[] result = new int[userNum];
Arrays.fill(result,Integer.MAX_VALUE);
// 边界值,初始化第一个用户选择各种策略的总消耗
for(int index=1;index <= 3;index++) {
dp[1][index] = res[0][index-1];
result[0] = Math.min(result[0],dp[1][index]);
}
dp[0][0] = 0;
// 因为前面用户选了某个策略,后面的用户就只能选不同的;所以对应了后面用户其实有三种选择情况
// 所有用户都可以在前面的用户选择后递推出自己的最优消耗
for(int i=2;i<=userNum;i++) {
dp[i][1] = Math.min(dp[i-1][2],dp[i-1][3]) + res[i-1][0];
dp[i][2] = Math.min(dp[i-1][1],dp[i-1][3]) + res[i-1][1];
dp[i][3] = Math.min(dp[i-1][1],dp[i-1][2]) + res[i-1][2];
result[i-1] = Math.min(result[i-1],Math.min(Math.min(dp[i][1],dp[i][2]),dp[i][3]));
}
System.out.println(result[userNum-1]);
}
}