HDU 1565 方格取数(1) (状态dp)

来源:互联网 发布:关于java的书 编辑:程序博客网 时间:2024/05/08 14:12

OJ题目:click here ~~

数不相邻,使得总和最大。

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;}


0 0
原创粉丝点击