石子合并
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[300];
int dp[210][210];
int main()
{
for(int i=1;i<210;i++)
for(int j=1;j<210;j++)
{
dp[i][j]=999999999;
}
//////////////////
for(int i=1;i<210;i++)
{
dp[i][i]=0;
}
//////////////////////
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
for(int i=2; i<=n; i++)
{
for(int j=1; j<=n-i+1; j++)
{
for(int k=j; k<=j+i-1-1; k++)
{
int sum=0;
for(int m=j;m<=j+i-1;m++)
{
sum+=a[m];
}
dp[j][j+i-1]=min(dp[j][j+i-1],sum+dp[j][k]+dp[k+1][j+i-1]);
}
}
}
cout<<dp[1][n]<<endl;
}
数位dp
dfs递归
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[30];//=
int dp[30][10];
///
long long dfs(int pos,int pre,bool limit)
{
if(pos==0)
{
return 1;
}
if(dp[pos][pre]!=-1&&limit==0)
return dp[pos][pre];
int up;
if(limit==true)
{
up=a[pos];
}
else
up=9;
long long ans=0;
for(int i=0;i<=up;i++)
{
if(i==4)
continue;
if(pre==6&&i==2)
continue;
ans+=dfs(pos-1,i,limit&i==up);
}
if(limit==0)
{
dp[pos][pre]=ans;
}
return ans;
}
long long solve(int x)
{
int cnt=0;
int y;
while(x>0)
{
y=x%10;
a[++cnt]=y;
x/=10;
}
return dfs(cnt,0,1);
cout<<dfs(cnt,0,1);
}
int main()
{
int n,m;
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
{
break;
}
solve(m);
///cout<<solve(m)<<endl;
cout<<solve(m)-solve(n-1)<<endl;
}
return 0;
}
3.状压dp
#include<iostream>
#include<cstdio>
#define Max 1200
#include<cstring>
int bit[Max];
int save[Max];
long long ans[10];
long long dp[2][Max];
using namespace std;
long long MOD = 1000000007;
int main()
{
int cnt=0;
for(int i=1; i<(1<<10); i++)
{
bit[i]=(bit[i>>1]+ (i&1) );
if(bit[i]%2==0)
{
save[cnt++]=i;
}
}
int t;
scanf("%d",&t);
while(t--)
{
int n,q;
cin>>n>>q;
char ch;
int l,r;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
dp[1][0]=1;
int flag=0;
for(int k=0; k<q; k++)
{
memset(ans,0,sizeof(ans));
cin>>ch;
scanf("%d%d",&l,&r);
int temp=(1<<(l-1))+(1<<(r-1));
if(ch=='+')
{
for(int i=0; i<cnt&&save[i]<(1<<n); i++)
{
dp[flag^1][ save[i] ]=dp[flag][save[i] ];
if( (save[i]&temp)==temp)
{
dp[flag^1][ save[i] ]+=dp[flag][ save[i]^temp ];
dp[flag^1][ save[i] ]%=MOD;
}
ans[ bit[save[i]]/2 ]+=dp[flag^1][ save[i] ];
ans[bit [save[i]]/2]%=MOD;
}
}
else if(ch=='-')
{
for(int i=0; i<cnt&&save[i]<(1<<n); i++)
{
dp[flag^1][ save[i] ]=dp[flag][save[i]];
if( (save[i]&temp)==temp)
{
dp[flag^1][ save[i] ]-=dp[flag][ save[i]^temp ];
dp[flag^1][ save[i] ]%=MOD;
}
ans[ bit[save[i]]/2 ]+=dp[flag^1][ save[i] ];
ans[bit [save[i]]/2]%=MOD;
}
}
flag^=1;
for(int i=1; i<=n/2-1; i++)
{
printf("%lld ",ans[i]);
}
printf("%lld\n",ans[n/2]);
}
}
return 0;
}