HDU 2167 状压DP
2015-07-25 16:46
323 查看
方格取数问题,给出n*n矩阵,3<n<15
求能取得的最大和,要求取某个位置的数以后,其周围的8个数字均不能再取
先预处理出来所有的可取状态,n=15时只有1597个状态,然后地推求解即可
求能取得的最大和,要求取某个位置的数以后,其周围的8个数字均不能再取
先预处理出来所有的可取状态,n=15时只有1597个状态,然后地推求解即可
#include "stdio.h" #include "string.h" int n,ans; int b[21],a[21][21],s[1700]; int dp[21][70001],sum[21][70001]; int Max(int a,int b) { if (a<b) return b; else return a; } void DP() { int tot,cnt,i,j,k; tot=b -1; cnt=0; memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); for (i=0;i<=tot;i++) { if ((i<<1)&i) continue; s[cnt++]=i; } for (i=0;i<n;i++) for (j=0;j<cnt;j++) for (k=0;k<n;k++) if (b[k]&s[j]) sum[i][j]+=a[i][k]; for (i=0;i<cnt;i++) dp[0][i]=sum[0][i]; for (i=1;i<n;i++) for (j=0;j<cnt;j++) for (k=0;k<cnt;k++) { if (s[j]&s[k]) continue; if ((s[j]<<1)&s[k]) continue; if ((s[j]>>1)&s[k]) continue; dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); } ans=0; for (i=0;i<cnt;i++) ans=Max(ans,dp[n-1][i]); } int main() { int i,k,j; char str[101]; b[0]=1; for (i=1;i<=20;i++) b[i]=b[i-1]*2; while (gets(str)) { n=(strlen(str)+2)/3; k=0; for (i=0;i<str[i];i+=3) a[0][k++]=(str[i]-'0')*10+str[i+1]-'0'; for (i=1;i<n;i++) for (j=0;j<n;j++) scanf("%d",&a[i][j]); DP(); printf("%d\n",ans); getchar();getchar(); } return 0; }
相关文章推荐
- iOS NSString的常用用法
- 通过回调实现Service中更新UI。
- Oauth github 参考链接
- 噩梦5 BloomOptimized 物体人物发光
- jsoup初识
- Android图片的拉取与缓存
- [Android developers blog 学习笔记]android 布局优化:标签include和merge的使用
- 关于Flash中的黑白棋AI编写心得
- 简单了解了一下 Java线程池 ThreadPoolExecutor
- 传统模式下WebService与WebAPI的相同与不同
- ios入门之c语言篇——基本函数——3——判断日期是一年的第几天
- 新人入职培训有关职场沟通的总结分享
- [Effective Java]第九章 异常
- 锡拉库萨中文离线地图App上线
- jiffies 时间转换
- 【BFS搜索】poj1945 Power Hungry Cows
- SAP推出iPhone手机端企业智能管理应用
- 企业移动应用平台:走进SAP SUP的世界
- Collection接口和Collections类的简单区别和讲解
- MySQL-终端基本操作