题目大意: 中文的。。。。。
解题思路: 猛一看题目,没什么思路,仔细思考两分钟之后发现是状态压缩(主要是数据范围给了思路)
用dp【i】数组表示当前状态下的最大金币,从1<<max-1 暴力到1就行了。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int n;
class MAX_Value
{
int maxx;
int a[11][11];int dp[11000];
void solve_the_quesion();
void Print_The_key();
public:
void solve();
MAX_Value();
};
MAX_Value::MAX_Value()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",*(a+i)+j);
memset(dp,0,sizeof(dp));
maxx=0;
}
void MAX_Value::solve()
{
solve_the_quesion();
}
void MAX_Value::solve_the_quesion()
{
int max_num=1<<n;
for(int i=max_num-1;i>=0;i--)/// All the state ;
{
int current_state=i;
for(int j=0;j<n;j++)
{
if(current_state&(1<<j))/// The first num for used
{
for(int k=0;k<n;k++)
{
if((k!=j)&&(current_state&(1<<k)))
{
int for_used_word=current_state-(1<<k);
dp[for_used_word]=max(dp[for_used_word],dp[current_state]+a[j][k]);
}
}
}
}
}
for(int i=0;i<1<<n;i++)
this->maxx=max(dp[i],maxx);
Print_The_key();
}
void MAX_Value::Print_The_key()
{
cout << this->maxx <<endl;
}
int main()
{
while(cin>>::n)
{
MAX_Value *key;///made by ACM_asdasd
key=new MAX_Value;
key->solve();
}
}