这是记录犯过的蠢系列的第一篇:爆int
例子如下
题目是一道简单的二进制状态压缩DP:CodeForces - 580D
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
long long a[300000][20];
long long rule[30][30];
long long w[30];
int main()
{
long long n,m,ans,l,j,k,i,u,v,t,max;
cin>>n>>m>>k;
for (i=1;i<=n;i++)
cin>>w[i];
max=(1<<n)-1;
memset(rule,0,sizeof(rule));
for (i=1;i<=k;i++)
{
cin>>u>>v>>t;
rule[u][v]=t;
}
for (i=1;i<=max;i++)
for (j=1;j<=n;j++)
a[i][j]=-1;
for (j=1;j<=n;j++)
{
a[1<<(j-1)][j]=w[j];
}
for (k=1;k<=m-1;k++)
{
for (i=max;i>=1;i--)
for (j=1;j<=n;j++)
{
if (a[i][j]!=-1)
{
for (l=1;l<=n;l++)
{
if ((i>>(l-1))%2==0)
{
if (a[i+(1<<(l-1))][l]<a[i][j]+rule[j][l]+w[l])
{
a[i+(1<<(l-1))][l]=a[i][j]+rule[j][l]+w[l];
}
}
}
a[i][j]=-1;
}
}
}
ans=0;
for (i=1;i<=max;i++)
for (j=1;j<=n;j++)
if (ans<a[i][j]) ans=a[i][j];
cout<<ans<<endl;
return 0;
}
以上为AC代码 下方为WA代码
#include<iostream>
#include<cstring>
using namespace std;
long long a[300000][20];
int rule[30][30];
int w[30];
int main()
{
int n,m,ans,l,j,k,i,u,v,t,max;
cin>>n>>m>>k;
for (i=1;i<=n;i++)
cin>>w[i];
max=(1<<n)-1;
memset(rule,0,sizeof(rule));
for (i=1;i<=k;i++)
{
cin>>u>>v>>t;
rule[u][v]=t;
}
for (i=1;i<=max;i++)
for (j=1;j<=n;j++)
a[i][j]=-1;
for (j=1;j<=n;j++)
{
a[1<<(j-1)][j]=w[j];
}
for (k=1;k<=m-1;k++)
{
for (i=max;i>=1;i--)
for (j=1;j<=n;j++)
{
if (a[i][j]!=-1)
{
for (l=1;l<=n;l++)
{
if ((i>>(l-1))%2==0)
{
if (a[i+(1<<(l-1))][l]<a[i][j]+rule[j][l]+w[l])
{
a[i+(1<<(l-1))][l]=a[i][j]+rule[j][l]+w[l];
}
}
}
a[i][j]=-1;
}
}
}
ans=0;
for (i=1;i<=max;i++)
for (j=1;j<=n;j++)
if (ans<a[i][j]) ans=a[i][j];
cout<<ans<<endl;
return 0;
}
虽然注意到了1e9爆int 当时计算过程中出现了int+long long 出错后检查了好久的算法