栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态规划法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划法

一、0/1背包


#include 
#include 
#include 
#include 
using namespace std;
 
char x[505];
int weight[505],value[505];
int q[505][505];
int main()
{
    int i, j, length, maxWeight;
    
    scanf("%d",&length);
    scanf("%d",&maxWeight);
    for(i=1;i<=length;i++){
    	scanf("%d %d",&weight[i],&value[i]);
	}

    
	for(i = 0; i <= length; i++)
    {/// 初始化状态数组q的第一列
            q[i][0] = 0;
    }
    for(j = 0; j <= maxWeight; j++)
    {/// 初始化状态数组q的第一行
            q[0][j] = 0;
    }
    
    
    
    for(i = 1; i <= length; i++)
        {///此处 i 最后应该等于 length_x 此时为x[length_x - 1]对应于q[length_x]
            for(j = 1; j <= maxWeight; j++)
            {///此处 j 最后应该等于 length_j 此时为x[length_j - 1]对应于q[length_j]
                if(jq[i-1][j-weight[i]]+value[i]){
                	 	q[i][j] = q[i-1][j];
					}else{
						q[i][j] =q[i-1][j-weight[i]]+value[i];
					}
				
				}
            }
    	}
        for(i=0;i<=length;i++){
        	for(j=0;j<=maxWeight;j++){
        		 printf("%3d", q[i][j]);
        	}
        	 printf("n");
        }
        int r=maxWeight;
        
        for(i=length;i>=1;i--){
        	
        	if(q[i][r]==q[i-1][r]){
        		
        		x[i]=0;
        		printf("dp[%d][%d]==dp[%d][%d] ==> x[%d]=0, r=%dn",i,r,i-1,r,i,r);
			}else{
				x[i]=1;
					printf("dp[%d][%d]!=dp[%d][%d] ==> x[%d]=1, r=%dn",i,r,i-1,r,i,r-weight[i]);
				r=r-weight[i];
			}
			
		}
		int maxv=0;
		 for (int i=1;i<=length;i++){
		 	if(x[i]==1){
		 		maxv=maxv+value[i];
			 }
		 }
		 printf("maxv:%dn",maxv);
		 printf("x=[ "); 
		 for (int i=1;i<=length;i++) printf("%d ",x[i]); 
		 printf("]n");

    return 0;
}

二.最长公共子序列问题(动态规划)

#include 
#include 
#include 
#include 
using namespace std;
 
char x[505], y[505];
int q[505][505];
int main()
{
    int i, j, length_x, length_y;
    while(~scanf("%s %s", x, y))
    {
        length_x = strlen(x);
        length_y = strlen(y);
        for(i = 0; i <= length_x; i++)
        {/// 初始化状态数组q的第一列
            q[i][0] = 0;
        }
        for(j = 0; j <= length_y; j++)
        {/// 初始化状态数组q的第一行
            q[0][j] = 0;
        }
        for(i = 1; i <= length_x; i++)
        {///此处 i 最后应该等于 length_x 此时为x[length_x - 1]对应于q[length_x]
            for(j = 1; j <= length_y; j++)
            {///此处 j 最后应该等于 length_j 此时为x[length_j - 1]对应于q[length_j]
                if(x[i - 1] == y[j - 1])///如果两个字符相等,则等于
                    q[i][j] = q[i - 1][j - 1] + 1;///其[i - 1][j - 1]的长度 + 1
                else if(q[i][j - 1] > q[i - 1][j])///若两字符不相等且左方大于上方
                    q[i][j] = q[i][j - 1];///则该位置长度等于左方长度
                else///上方大于左方
                    q[i][j] = q[i - 1][j];
                    
          
            }///简单来讲,就算取上方和左方的最大值, max(q[i - 1][j], q[i][j - 1])
            
        }
        for(i=0;i<=length_x;i++){
        	for(j=0;j<=length_y;j++){
        		 printf("%d ", q[i][j]);
        	}
        	 printf("n");
        }
        printf("maxL:%dn", q[length_x][length_y]);///输出对应最后一个字符的长度
    }
    return 0;
}

三.编辑距离问题(动态规划)

#include 
#include 
#include 
#include 
using namespace std;
 
char x[505], y[505];
int q[505][505];
int main()
{
    int i, j, length_x, length_y;
    while(~scanf("%s %s", x, y))
    {
        length_x = strlen(x);
        length_y = strlen(y);
        for(i = 0; i <= length_x; i++)
        {/// 初始化状态数组q的第一列
            q[i][0] = i;
        }
        for(j = 0; j <= length_y; j++)
        {/// 初始化状态数组q的第一行
            q[0][j] = j;
        }
        for(i = 1; i <= length_x; i++)
        {///此处 i 最后应该等于 length_x 此时为x[length_x - 1]对应于q[length_x]
            for(j = 1; j <= length_y; j++)
            {///此处 j 最后应该等于 length_j 此时为x[length_j - 1]对应于q[length_j]
                if(x[i - 1] == y[j - 1])///如果两个字符相等,则等于
                    q[i][j] = q[i - 1][j - 1];///其[i - 1][j - 1]的长度 + 1
                else{
                	int min=q[i-1][j-1]+1;
                	if(min>q[i][j-1]+1){
                		min=q[i][j-1]+1;
					}
					if(min>q[i-1][j]+1){
						min=q[i-1][j]+1;
					}
					q[i][j]=min;
				}
                    
             
          
            }
            
        }
        for(i=0;i<=length_x;i++){
        	for(j=0;j<=length_y;j++){
        		 printf("%d ", q[i][j]);
        	}
        	 printf("n");
        }
        printf("minD:%dn", q[length_x][length_y]);///输出对应最后一个字符的长度
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/656178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号