关闭

电路布线问题

标签: 动态规划递归
166人阅读 评论(0) 收藏 举报
分类:

题目描述:
做电路板时,将n条连线分布到若干绝缘层上。在同一层的连线不相交。电路布线问题就是要确定将哪些连线安排到第一层上,使该层上有尽可能多的连线。

题目类型:递归、动态规划

题目分析:

1)当i=1时,size(i,j)={0, 当j<p(1)
                      {1, 当j>=p(1)
2)当i>1时,size(i,j)={size(i-1,j), 当j<p(i)
                    {max{size(i-1,j),size(i-1,p(i)-1)+1},当j>=p(i)

代码如下:

1)递归方法:

#include<stdio.h>
#define N 100
int a[N];
int fun(int i,int j)
{
    if(i==0) {
        if(j>=a[i])
            return  1;
        else
            return 0;
    }
    if(j<a[i])
        return fun(i-1,j);
    int m=fun(i-1,a[i]-1)+1;
    int n=fun(i-1,j);
    return m>n?m:n;
}
int main()
{
    int i,j,n;
    scanf("%d",&n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("%d\n",fun(n-1,n-1)); 
    return 0;
}

2)动态规划算法:

#include<stdio.h>
#define N 100 
int main()
{
    int i,j,n;
    int a[N],p[N][N];
    scanf("%d",&n);
    for(i=1;i<=n;i++) {//下标从1开始
        scanf("%d",&a[i]);
    }
    for(j=1;j<=n;j++) {
        if(j<a[1])
            p[1][j]=0;
        else
            p[1][j]=1;
    }
    for(i=2;i<=n;i++) {
        for(j=1;j<=n;j++) {
            if(j<a[i])//当j<c[i]的情形  
                p[i][j]=p[i-1][j];
            else
                p[i][j]=p[i-1][j]>p[i-1][a[i]-1]+1 ? p[i-1][j] : p[i-1][a[i]-1]+1;
        }
    }
    printf("%d\n",p[n][n]);
    return 0;
} 

这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:65217次
    • 积分:1738
    • 等级:
    • 排名:千里之外
    • 原创:112篇
    • 转载:6篇
    • 译文:0篇
    • 评论:26条
    博客专栏
    最新评论