FZU 1025 状压dp 摆砖块

云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了

这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 

dp思想都在代码注释里 

思想是很好想的..唯一的难点大概是 c++里面没有同或这种东西 得自己写

而我又不怎么会位运算 问了蕾姐半天也没搞懂怎么用~这个取反符号

到最后怒而手写了函数 

一开始想的是 init后 输入nm都可以秒出 但是在使用~的路途上 发现至少我的方法 做这个题 不能做到init后随便输入

因为 每行 都有(1<

所以每个数 如果枚举不到m位 我就把它当作m位 这个设置 在qf(int x,int len)里面

由于我需要输入m后再进行init 那么时间复杂度当然会比较高 limit:1000ms time:656ms 回头我再去看别人的直接算的办法

题目的错点 long long dp %I64d

#include
#include
#include
#include
#include
#include
using namespace std;
/// 状压dp 传说中黄老师讲的摆砖块
long long int dp[15][1<<12];
/// dp[i][k] i x k 状态
int n,m;
int qf(int x , int len)
{
    int w=0;
    int A[15];
    memset(A,0,sizeof(A));
    while(x>0)
    {
        w++;
        A[w]=x%2;
        x/=2;
    }
    int res=0;
    for(int i=1; i<=len; i++)
    {
        int q=1;
        if(A[i]==1)
            continue;
        for(int l=1; lw||A[i+1]!=1)
                return false;
            i++;
        }
    }
    return true;
}
int len;
int sz[2000];
void ok()
{
    for(int i=0; i<=(1<>n>>m)
    {
        if(n==0&&m==0)
            break;
        init();
        printf("%I64d\n",dp[n][(1<

  

 

转载于:https://www.cnblogs.com/rayrayrainrain/p/5580319.html

你可能感兴趣的:(FZU 1025 状压dp 摆砖块)