hdu 1565 状态压缩dp

C语言动态规划示例
本文展示了一个使用C语言实现的动态规划算法示例,该算法用于解决特定类型的组合优化问题。通过递归子结构特性,该算法有效地计算了最大值。文章包括完整的源代码,并解释了关键的数据结构如dp数组的使用。
#include<stdio.h>
#include<string.h>
int Max(int a,int b) {
    return a>b?a:b;
}
int  dp[3][1<<21];
int map[30][30];
int s[1<<21];
int main() {
    int i,j,k,n,num=0;
    for(i=0;i<(1<<21);i++)
         if(!(i&(i<<1)))
             s[num++]=i;
         while(scanf("%d",&n)!=EOF) {
            int  limit=1<<n;
             for(i=0;i<n;i++)
                 for(j=0;j<n;j++)
                     scanf("%d",&map[i][j]);
                 memset(dp,0,sizeof(dp));
                 int p=0;
                 for(i=0;i<n;i++) {
                     p^=1;
                     for(j=0;j<num;j++) {
                         int sum=0;
                         if(s[j]>limit)
                        break;
                         for(k=0;k<n;k++)
                             if(s[j]&(1<<k))
                                   sum+=map[i][k];
                             for(k=0;k<num;k++) {
                                 if(s[k]>limit)
                                break;
                                 if(!(s[j]&s[k]))
                                     dp[p][s[j]]=Max(dp[p][s[j]],dp[1-p][s[k]]+sum);
                             }
                     }
                 }
                 int max=0;
                 for(i=0;i<num&&s[i]<=limit;i++)
                     max=Max(max,dp[p][s[i]]);
                 printf("%d\n",max);
         }
         return 0;
}

转载于:https://www.cnblogs.com/thefirstfeeling/p/4410994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值