下面是本节课的所涉及取模知识和题目的代码汇总
因为头文件太长了 我就没贴上来了
需要用的话记得加上相应的头文件
1.加法取模、乘法取模、减法取模
ans=(ans%mod+b%mod)%mod; ans=(ans+b)%mod;
ans=(ans%mod*b)%mod; ans=ans*b%mod;
ans=(ans%mod-b%mod+mod)%mod ans=(ans-b+mod)%mod
2.最长上升子序列LIS(n^2dp做法)
题号 poj2533
int a[maxn],dp[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int maxx=0;
for(int i=1;i<=n;i++)
{
dp[i]=1;//最长上升子序列的值最小应该是1
for(int j=1;j<i;j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
maxx=max(dp[i],maxx);
}
printf("%d\n",maxx);
}
3.数字三角形问题(二维dp 正反两种统计方法)
题号 hdu2084
正
int a[maxn][maxn],dp[maxn][maxn];
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&dp[i][j]);
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,dp[n][i]);
printf("%d\n",ans);
}
}
倒
int a[maxn][maxn],dp[maxn][maxn];
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&dp[i][j]);
}
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
}
}
printf("%d\n",dp[1][1]);
}
}
4.最长公共子序列LCS
题号 HDU - 1159
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
while(scanf("%s%s",a+1,b+1)!=EOF)
{
int lena=strlen(a+1);
int lenb=strlen(b+1);
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++)
dp[i][j]=0;
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
if(a[i]==b[j])
{
dp[i][j]+=dp[i-1][j-1]+1;
}else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d\n",dp[lena][lenb]);
}
}
5.01背包(dp基本解法,两种滚动数组优化写发)
题号 HDU - 2602
int w[maxn],v[maxn];
int dp[maxn][maxn];
int n,m;
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
dp[i][j]=dp[i-1][j];
if(w[i]<=j)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
}
}
printf("%d\n",dp[n][m]);
}
}
滚动数组优化
int w[maxn],v[maxn];
int dp[5][maxn];
int n,m;
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
int tem=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
dp[tem][j]=0;
for(int j=0;j<=m;j++)
{
dp[tem][j]=dp[tem^1][j];
if(w[i]<=j)
dp[tem][j]=max(dp[tem^1][j],dp[tem^1][j-w[i]]+v[i]);
}
tem^=1;
}
printf("%d\n",dp[tem^1][m]);
}
}
int w[maxn],v[maxn];
int dp[maxn];
int n,m;
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[m]);
}
}