题目
动态规划
思路:
我是看上面的连接,才懂的
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long n,an=0;
string tr[500033];
int b[500303],c[500303],a[11];
int main()
{
//加速
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>tr[i];
b[i]=*tr[i].begin()-'0';
c[i]=*tr[i].rbegin()-'0';
if(i==1)
{
a[c[i]]++;
}
else
{
a[c[i]]=max(a[c[i]],a[b[i]]+1);
}
}
int ans=-1;
for(int i=1;i<10;i++)
{
ans=max(ans,a[i]);
}
cout<<n-ans;
return 0;
}
错误思路:
用深度搜索,每个数字都可以去掉或者不去掉
错误代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
//数据范围
//输出格式
//i,j,x,y写错
//scanf("%lld",&a); 忘加&
long long n,an=0;
string a[500033];
int b[500303],c[500303];
void dfs(int step,int laststep,int num)
{
if(step==n)
{
an=an>num?an:num;
return ;
}
if(laststep==-1)
{
dfs(step+1,step,num+1);
dfs(step+1,-1,num);
}
else
{
if(b[step]==c[laststep])
{
dfs(step+1,step,num+1);
dfs(step+1,laststep,num);
}
else
{
if((n-step)>an)
dfs(step+1,step,1);
dfs(step+1,laststep,num);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i]=*a[i].begin()-'0';
c[i]=*a[i].rbegin()-'0';
}
dfs(0,-1,0);
cout<<n-an;
return 0;
}