G. 不再孤独的HandsomeHow
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
Sample Input
2 2 0 2 2 0 4 0 2 4 6 2 0 8 3 4 8 0 7 6 3 7 0
Sample Output
2 14
Hint
对于组样例, 他们同时吃第一串和第二串, 好感度会增加2
对于第二组样例, 他们先吃第一串和第四串,好感度增加了6, 然后吃第二串和第三串,好感度增加量8,总共增加了14
#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
int v[16][16];
int n;
int dp[1<<15];
void show(int x)
{
for(int i=0;i<n;i++)
{
if(x>>i&1)
printf("1");
else
printf("0");
}
printf("\n");
}
int dfs(int s)
{
// printf("begin dp=%d ",dp[s]);
// show(s);
if(dp[s]>=0)
return dp[s];
if(s==(1<<n)-1)
return dp[s]=0;
int res=-1;
for(int p=0;p<n;p++)
{
if(!(s>>p&1))
{
for(int k=0;k<n;k++)
{
if(k!=p&&!(s>>k&1))
{
// printf("p=%d k=%d v=%d \n",p,k,v[p][k]);
res=MAX(res,dfs(s|1<<p|1<<k)+v[p][k]);
// printf("res=%d\n");
}
}
}
}
/// printf("end dp=%d ",dp[s]);
// show(s);
return dp[s]=res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&v[i][j]);
printf("%d\n",dfs(0));
}
}