loj1011 状态压缩

题目链接:http://lightoj.com/volume_showproblem.php?problem=1011

思路:最近的开始做dp了。。。很明显的一道状态压缩题,dp[n][state]表示前n行状态为state的最大值。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int dp[17][1<<17];
 8 int n, num[17][17];
 9 
10 int main()
11 {
12     int _case, t = 1;
13     scanf("%d", &_case);
14     while(_case--){
15         scanf("%d", &n);
16         for(int i = 0; i < n; i++)
17             for(int j = 0; j < n; j++)
18                 scanf("%d", &num[i][j]);
19         for(int i = 0; i < n; i++)
20             for(int j = 0; j < (1<<n); j++)dp[i][j] = -1;
21         for(int i = 0; i < n; i++)dp[0][1<<i] = num[0][i];
22         for(int i = 1; i < n; i++){
23             for(int state = 0; state < (1<<n); state++){
24                 for(int j = 0; j < n; j++)if(!(state&(1<<j))){
25                     if(dp[i-1][state] == -1)continue;
26                     dp[i][state|(1<<j)] = max(dp[i][state|(1<<j)], dp[i-1][state]+num[i][j]);
27                 }
28             }
29         }
30         printf("Case %d: %d\n", t++, dp[n-1][(1<<n)-1]);
31     }
32     return 0;
33 }
34 
35                     
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值