京东烽火台编程交流

/**
*做题的时候看题目看乱了,结束后才在牛客网友提示下明白了题目意思,明白意思后第一感觉是动态规划,于是用动态规划试着实现了一下
*思路:利用一个m*m矩阵,m[i][j]表示arr[i] 、arr[j](即小山i、j能否通信)能否配对,能配对值为1,否则为0
*最后累加矩阵的值除以2得到结果,时间复杂度为O(n^2)
*具体注释如下
*在此感谢左程云老师,关于这方面的知识是在他的公开课上学的
*/
public int getCount(int[] arr) {
	if (arr == null || arr.length < 2) {
		return 0;
	} else {
		int res = 0;
		int[][] dp = getDP(arr);
		for (int i = 0; i < dp.length; i++) {
			for (int j = 0; j < dp.length; j++) {
				res += dp[i][j];
			}
		}
		return res / 2;
	}
}

public int[][] getDP(int[] arr) {
	int[][] dp = new int[arr.length][arr.length];
	dp[0][arr.length - 1] = 1;  //头尾是相邻的,配对
	dp[arr.length - 1][0] = 1;
	for (int i = 0; i < dp.length; i++) {
		for (int j = 0; j < dp.length; j++) {
			if(dp[i][j] == 0){
				if(i == j){
					dp[i][j] = 0;   //自己跟自己不配对
				}else if (i == j - 1 || j == i - 1) {
					dp[i][j] = 1;   //相邻的配对
				} else {
                                        //如果dp[i][j-1]为1,则arr[j-1]满足arr[j - 1] <= Math.min(arr[i], arr[j])使arr[i]、arr[j]配对
					if (j > 0 && dp[i][j - 1] == 1
							&& arr[j - 1] <= Math.min(arr[i], arr[j])) {
							dp[i][j] = 1;
					}
                                        //如果dp[i-1][j]为1,则arr[i-1]满足arr[i - 1] <= Math.min(arr[i], arr[j])使arr[i]、arr[j]配对
					if (i > 0 && dp[i - 1][j] == 1
							&& arr[i - 1] <= Math.min(arr[i], arr[j])) {
						dp[i][j] = 1;
					}
				}
			}
		}
	}
	return dp;
}

#京东#
全部评论
难道不应该只是一个上三角就可以了?
点赞 回复
分享
发布于 2016-09-05 23:39
然而m的范围是10^6。二维内存会爆 但是神奇的是N^2的算法直接AC了
点赞 回复
分享
发布于 2016-09-05 22:55
滴滴
校招火热招聘中
官网直投
贴个java的 public int GetCount(ArrayList<Integer> list) { if (list == null) { return 0; } int count = 0, len = list.size(); for (int i = 0; i < len; i++) { int max; count++; if (list.get(i) > list.get(i + 1)) { max = list.get(i+1); for (int j = i + 1; j < i + len - 1 && max<list.get(i); j++) { if (max < list.get(j + 1)) { count++; max = list.get(j + 1); } else { break; } } } list.add(list.get(i)); } return count; }
点赞 回复
分享
发布于 2016-09-06 13:06

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务