CF543C Remembering Strings 状压dp
2024-10-07 08:12:58
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define inf (1<<22)
#define maxn 30
using namespace std;
char s[maxn][maxn];
int data[maxn][maxn],common[maxn][maxn],b[maxn][maxn],dp[inf],n,m;
int main() {
// setIO("input");
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) scanf("%s",s[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
scanf("%d",&data[i][j]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j) {
int sum=0,x=-inf;
for(int k=0;k<n;++k) {
if(s[k][j]==s[i][j]) {
sum+=data[k][j],x=max(x,data[k][j]);
common[i][j]|=(1<<k);
}
}
b[i][j]=sum-x;
}
memset(dp,0x3f,sizeof(dp)), dp[0]=0;
int re=(1<<n);
for(int i=0;i<re;++i)
for(int j=0;j<n;++j)
if((i&(1<<j))==0) {
for(int k=0;k<m;++k) {
dp[i|(1<<j)]=min(dp[i|(1<<j)], dp[i]+data[j][k]);
dp[i|common[j][k]]=min(dp[i|common[j][k]], dp[i]+b[j][k]);
}
}
printf("%d\n",dp[re-1]);
return 0;
}
最新文章
- ATPCS和AAPCS
- Linux Dynamic Shared Library &;&; LD Linker
- findByExample(Object exampleEntity)方法得到的List判断是否为空,不可用(lis != null)
- 如何:在 StackPanel 和 DockPanel 之间进行选择
- Oracle11g R2学习系列 之五回闪
- 远程调试weinre的使用
- HDU4850 构造一个长度n串,它需要随机长度4子是不相同
- UVA Getting in Line
- [DP优化方法之虚树]
- Docker 中的一些概念
- npm包管理器小节一下
- 007-li标签CSS水平居中垂直居中
- Normalize.css &; Reset
- ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
- leetcode23
- python 协程库gevent学习--源码学习(一)
- CUBA如何新增ServiceBean
- Redis上踩过的一些坑
- IllegalArgumentException: Unmatched braces in the pattern.
- [.NET开发] 浅说C#异步和同步