HDU 1565 方格取数(1) (状态dp)
2014-04-20 12:08
253 查看
OJ题目:click here ~~
数不相邻,使得总和最大。
AC_CODE
数不相邻,使得总和最大。
AC_CODE
int grid[20][20] , dp[21][17800]; int n; vector<int> states; inline int MAX(int x , int y) { return x > y ? x : y; } int sum(int row , int x) { int ret = 0; for(int i = 0;i < n;i++) { if(x&(1<<i)) ret += grid[row][i]; } return ret; } int main() { states.clear(); for(int i = 1;i < (1<<20);i++)//枚举第0行的状态 { if(i&(i<<1)) continue; states.push_back(i); } while(scanf("%d",&n) != EOF) { if(n == 0) { printf("0\n"); continue; } int i , j , k , row; for(i = 0;i < n;i++) for(j = 0;j < n;j++) scanf("%d" , &grid[i][j]); memset(dp , 0 , sizeof(dp)); for(i = 0;states[i] < (1<<n);i++)//枚举第0行的状态 { dp[0][i] = sum(0 , states[i]); } for(row = 1;row < n;row++)//从第1行开始 { for(i = 0;states[i] < (1<<n);i++)//枚举本行的状态 { for(j = 0;states[j] < (1<<n);j++)//枚举上一行的状态 { if(states[i]&states[j]) continue; dp[row][i] = MAX(dp[row][i] , dp[row - 1][j] + sum(row , states[i])); } } } int ans = -1; for(i = 0;states[i] < (1<<n);i++) ans = Max(ans , dp[n-1][i]); printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 1565 方格取数(1) (状态压缩DP入门题 2)(待更新)
- hdu 1565 方格取数(1)(状态压缩DP)
- HDU 1565 方格取数(1)(状态压缩DP)
- HDU 1565 方格取数(1) 状态压缩DP
- HDU1565方格取数(1)(状态压缩DP)
- hdu 1565 方格取数(1)(状态压缩dp)
- hdu 1565 方格取数(1)(DP 状态压缩)
- HDU 1565 方格取数(1)(插头DP||状态压缩)
- hdu 1565 方格取数(1)(DP 状态压缩)
- HDU 1565 - 方格取数(1) 数据有些弱...状态压缩DP
- HDU1565 方格取数(1) (状态压缩DP)
- hdu 1565 方格取数(1) 状态压缩dp
- hdu 1565 方格取数(1) (最小割/状态压缩+DP)
- HDU1565 方格取数(1)(状态压缩dp)
- HDU 1565 方格取数(1)(状态压缩DP)
- hdu 1565 方格取数(1)(状态压缩dp)
- hdu 1565 方格取数(1) 状态压缩dp
- hdu 1565 方格取数(1)(状态压缩dp)
- hdu 1565 方格取数(1) (状态压缩DP)
- 状态压缩DP——hdu 1565 方格取数1