妹子刚学简单dp只过#1纠错无果求调
查看原帖
妹子刚学简单dp只过#1纠错无果求调
556545
_anll_楼主2024/11/26 21:37

rt,感觉已经改得和第一篇题解一模一样了还是不对,求大佬帮帮QAQ!

#include<cstring>
#include<iostream>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=1e5+5,M=30;
int n,m,k,num[N],mp[M][M],dp[N][M],sum[M][N],an[M],minn[N];
string s;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k>>s;s='6'+s;
	for(int i=1;i<=n;i++) num[i]=s[i]-'a'+1;
	for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) cin>>mp[i][j];
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
			for(int k=1;k<=m;k++)
				if(i!=j&&j!=k&&k!=i)
				mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
//	cout<<endl;
//	for(int i=1;i<=m;i++){
//		for(int j=1;j<=m;j++) cout<<mp[i][j]<<" ";
//		cout<<endl;
//	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			sum[i][j]=sum[i][j-1]+mp[num[j]][i];
		}
	}
	memset(an,0x3f,sizeof(an));
	memset(minn,0x3f,sizeof(minn));minn[0]=0;
	for(int i=k;i<=n;i++){
		for(int j=1;j<=m;j++){
			int nowlen=sum[j][i]-sum[j][i-k];
			an[j]=min(an[j]+mp[num[i]][j],minn[i-k]+nowlen);
			minn[i]=min(minn[i],an[j]);
		}
	}
	cout<<minn[n];
	return 0;
}
2024/11/26 21:37
加载中...