Presión introductoria dp hdu1565

Inserte la descripción de la imagen aquí
Idea: Convierta un número a un sistema binario para representar el número seleccionado en cada fila. Primero, preprocese qué números son los estados legales que se pueden obtener, porque no hay un borde común entre el enlace ascendente y el enlace descendente, y esta condición puede ser solía saber que el estado legal está satisfecho. Desplácese hacia la derecha o hacia la izquierda para pensar que la suma de la operación back & es 0, y almacene todos los Gefa en la matriz.
Luego, el ciclo triple directamente violento, use la matriz f [i] [j] para representar el valor máximo del estado seleccionado de la i-ésima fila de la fila i anterior con la representación binaria de j,
actualice la matriz a través de dp , y finalmente obtén el resultado.

#include <bits/stdc++.h>
const int INF=0x3f3f3f3f;
const int maxn=1<<17;
using namespace std;
typedef long long ll;
int t[maxn];//可以取得合法状态
int a[22][22];
int f[22][maxn];
int add(int i,int x){
    
    
    int res=0;
    int cnt=1;
    while(x){
    
    
        if(x&1)
            res+=a[i][cnt];
        x=x>>1;
        cnt++;
    }
    return res;
}//计算第i行,x状态下的和

int main ()
{
    
    
    //freopen("D:\\input.txt", "r", stdin);
    //freopen("D:\\output.txt", "w", stdout);
	int n;
	while(cin>>n){
    
    
        int cnt=0;
        int sum=0;
        for(int i=0;i<(1<<n);i++)
            if((i&(i>>1))==0)
               t[++cnt]=i;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++){
    
    
            for(int j=1;j<=cnt;j++){
    
    
                int s=add(i,t[j]);//这一行
                for(int k=1;k<=cnt;k++){
    
    
                    if((t[j]&t[k])==0){
    
    
                        f[i][j]=max(f[i][j],f[i-1][k]+s);
                    }
                }
            }
        }
        int m=0;
        for(int i=1;i<=cnt;i++){
    
    
            m=max(f[n][i],m);
        }
        printf("%d\n",m);
	}
    return 0;
}


Supongo que te gusta

Origin blog.csdn.net/u011612364/article/details/103940442
Recomendado
Clasificación