三、不相交的线 (Weekly Contest 134)

题目描述:
我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。

现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。

以这种方法绘制线条,并返回我们可以绘制的最大连线数。

示例 1:在这里插入图片描述
复杂度是O(n ^ 2)是跑不了的,一直使用动态规划,每次都取出最大值
代码:

class Solution {
    public int maxUncrossedLines(int[] A, int[] B) {
        int dp[][] = new int[A.length][B.length];
    	int i = A.length;
    	int j = B.length;
    	for (int x = 0 ; x < i; x++) {
    		for (int y = 0; y < j; y++) {
    			int tem = 0;
				if(A[x] == B[y]){
					if(x > 0 && y > 0 ){
						tem = dp[x - 1][y - 1] + 1;
					}else {
						tem = 1;
					}
					
				}
			int max = 0;
				int tems = 0;
				if(x > 0){
					tems = dp[x-1][y];
				}
				int temy = 0;
				if( y > 0){
					temy = dp[x][y - 1];
				}
				
				
				max = Math.max(tem, Math.max(tems,temy));
				dp[x][y] = max;
				
			}
			
		}
    	
    	return dp[A.length - 1][B.length - 1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值