题目是中文的,我就不描述题意了。
题目用到的主要算法是状态压缩dp。
思路是,我们要知道n行最多的炮数,只要知道n-2行所有状态最多的炮数,就可以根据n-1行和n行最多可行的状态算出。也就是说,n-2行以前的炮无论怎样放,都不会影响到第n行炮的放法。
1
2
#include <cstdio>
3
#include <cmath>
4
#include <cstdlib>
5
6
const int large = (int)pow( 2, 10 );
7
int n,m;
8
char map[105][15];
9
int dp[60][60][101];
10
int stack[large];
11
int len = 0;
12
13
//now是当前行,last是上一行,n是行号。其中,now,last都是stack的下标,不是状态
14
int Fun( int now, int last, int n )
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15