动态规划核心最优子结构:找出当前最优子结构:正数可以正数 * 正数 也可以由两个负数想乘得到,那么可以有状态转移方程:
arr[i] > 0 :
dp[i][0] = dp[i- 1][0] + 1; dp[i][1] = dp[i - 1] + 1
arr[i] < 0 : 当前数为负数只要交替更新一下
dp[i][0] = dp[i- 1][1] + 1; dp[i][1] = dp[i - 0] + 1
然后只需要注意一些base case 负数数组长度为0 遇到正数还是继续保持0;同理 遇到负数 正数数组继续保持0
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; sc.hasNextInt(); i++) {
arr[i] = sc.nextInt();
}
int[][] dp = new int[n + 1][2];
int max = 0;
dp[0][0] = 0;
dp[0][1] = 0;
for(int i = 1; i <= n; i++) {
if(arr[i - 1] > 0) {
//乘积为正数 长度 + 1
dp[i][0] = dp[i - 1][0] + 1;
//维护负数长度 如果不为0 才能维护 长度+1
if(dp[i - 1][1] == 0) {
dp[i][1] = 0;
} else {
dp[i][1] = dp[i - 1][1] + 1;
}
//因子为负数 那么交替更新
} else if(arr[i - 1] < 0) {
//负数最长为 正数最长 + 1
dp[i][1] = dp[i - 1][0] + 1;
if(dp[i - 1][1] == 0) {
dp[i][0] = 0;
} else {
dp[i][0] = dp[i - 1][1] + 1;
}
}
}
for(int i = 0; i <= n; i++) {
max = Math.max(max, dp[i][0]);
}
System.out.print(max);
}



