题目:
由于工作业绩优秀,公司给小Q放了n天的假,身为工作狂的小Q打算在假期中工作、锻炼和休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最小需要休息几天?
输入:
第一行表示放假天数
第二行n个数,0或1,表示公司第i天是否营业
第三行表示健身房
1为营业 0为不营业
输出:
表示小Q休息的最少天数
方法:动态规划
思路:
先分析dp状态
dp[i][j],i为第几天,j可以去0,1,2表示第i天工作,健身,休息
然后dp方程:
dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+(work[i]==0?1:0)
dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+(gym[i]==0?1:0)
dp[i][2]=Math.min(dp[i-1][1],Math.min(dp[i-1][0],dp[i-1][2]))+1
记得初始化第0天的值,如果工作或健身为0就赋值为1
代码:
public static int xiuXi(int[] work,int[] gym){
int length = work.length;
int[][] dp = new int[length][3];
if(work[0]==0){
dp[0][0]=1;
}
if(gym[0]==0){
dp[0][1]=1;
}
dp[0][2]=1;
for (int i = 1; i <length ; i++) {
dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+(work[i]==0?1:0);
dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+(gym[i]==0?1:0);
dp[i][2]=Math.min(dp[i-1][1],Math.min(dp[i-1][0],dp[i-1][2]))+1;
}
return Math.min(dp[length-1][0],Math.min(dp[length-1][1],dp[length-1][2]));
}
public static void main(String[] args) {
int[] work = new int[]{1,1,0,0};
int[] gym = new int[]{0,1,1,0};
System.out.println(xiuXi(work,gym));
}