洛谷P1433 吃奶酪和memset

奶酪
状态压缩(状压DP)

#include 

 using namespace std;
 double x[16],y[16],dis[16][16],f[1<<16][16];
 //dis[i][j]是i到j的距离
 //f[k][i]k中1表示未吃的奶酪,i表示老鼠所在的位置
 int main(){
    ios::sync_with_stdio(false);
    int n,i,j,k;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>x[i]>>y[i];
    for(i=0;i<=n;i++)
        for(j=0;j<i;j++)
            dis[j][i]=dis[i][j]=sqrt(pow((x[i]-x[j]),2)+pow((y[i]-y[j]),2));
    memset(f,0x7f,sizeof(f));
    for(k=(1<<n+1)-1,i=0;i<=n;i++)
        f[k][i]=0;
     //前三行初始化f
    for(k=(1<<n+1)-2;k>0;k--){
    //for(k=(1<
            //cout<(k)<
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                if(!(k&1<<j))//如果到过那个位置(k上相应位置为0)
                    f[k][i]=min(f[k][i],f[k|1<<j][j]+dis[i][j]);
                    //cout<<"i="<
    }
    printf("%.2f\n",f[1][0]);//只循环了到k=1(只剩原点,dis[0][0]=0),不然输出f[0][0]也一样
    return 0;
 }

  • memset(f,0x7f,sizeof(f)) 和 memset(f,127,sizeof(f));
    赋值后都为2139062143(二进制为4个 0111 1111),可以将其视为INF(无穷大)
    PS. memset(f,128,sizeof(f)) 赋值后都为 -2139062144
    memset(f,1,sizeof(f)) 赋值后都为 16843009

  • cout<4>(k)< 输出为44字节(k为int型)长度的二进制
    PS.

#include 

using namespace std;

int main()
{
    int x=1<<5-1;
    int y=1<<(5-1);
    cout<<bitset<sizeof(x)*8>(x)<<endl;
    cout<<bitset<sizeof(y)*8>(y)<<endl;
     return 0;
}

运行结果为
在这里插入图片描述

你可能感兴趣的:(笔记)