一维数据动态规划分组问题

觅食的haruko 2017-06-15 09:53:51
一维正整数递减序列d实现由动态规划得到k-匿名序列d',即每组至少含有k个元素,且每组的值都是此组元素的平均值。由动态规划实现分组,且d'与d的整体代价最小。自己写程序如下,不知道如何存储并返回每一次计算出的分组号,循环多次就会出现错误。
#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
typedef vector<vector<int> > Mat;

#define N 15
#define k 3
int deg[]={10,10,10,10,6,6,6,6,3,3,3,3,2,2,2};
int I[N][N]={0};
int Da[N]={0};
int Degree2[N]={0};
vector<vector<int> > localgroup;
vector<int> groupdivide;
struct min_local{
int location;
int min_d;
min_local(){
location=0;
min_d=0;
}
};
min_local min_I(int i);


void cost_simple(int Degree[])//每个元素到最末端作为一个大分组的代价
{ int i,j,t,h,m,GroupD;
int sum=0;
for(i=0;i<N;i++)
{
for(j=i;j<N;j++)
{
sum+=Degree[j];
GroupD=(int)(sum/(j-i+1));
for(h=i;h<=j;h++) I[i][j]+=abs(GroupD-Degree[h]);
}
sum=0;
}
cout<<"所有子序列的I代价"<<endl;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cout<<I[i][j]<<"\t";
}
cout<<endl;
}
for(i=N-k;i>k-1;i--)
{
if(i>N-2*k)
{ for(m=i;m<N;m++) Da[i]=I[i][N-1];}

}
}
void DP(int Degree[])//动态规划
{
int i,j,t,h,m,GroupD;
int seqIL[N]={0};
int group_num[N]={0};
if(N<2*k)
cout<<"不能k匿名"<<endl;
else if(N>=2*k)
{
cout<<"开始动态规划"<<endl;
for(i=N-k;i>k-1;i--)
{
if(i>N-2*k)
{ for(m=i;m<N;m++) Da[i]=I[i][N-1];}//最末尾的2k个元素不能再划分子序列。
}
for (t=k-1;t<N-k-1;t++)
{
min_local ml1 = min_I(t+1);
seqIL[t]=I[0][t]+ml1.min_d;
Da[t]=(seqIL[t]<I[0][N-1])?seqIL[t]:I[0][N-1];
localgroup.push_back(groupdivide);
groupdivide.clear();
}
cout<<"代价为"<<endl;
for(j=0;j<N;j++)
cout<<Da[j]<<" ";
cout<<endl;
cout<<"分组界限为"<<endl;
for(j=0;j<localgroup.size();j++){
cout<<"localgroup size:"<<localgroup.size()<<","<<localgroup[j].size()<<endl;
for(i=0;i<localgroup[j].size();i++)
cout<<localgroup[j][i]<<" ";
cout<<endl;
}
}
}

min_local min_I(const int r)
{
int min=I[r][N-1];
min_local ml;
int label=0;;
for(int q=r+k-1;q<N-k;q++)
{
if(q+1>=N-2*k){
Degree2[r]=I[r][q]+I[q+1][N-1];
}
else if(q+1<N-2*k) {
ml=min_I(q+1);
Degree2[r]=I[r][q]+ml.min_d;
}
if(min>Degree2[r])
{
min=Degree2[r];
ml.min_d=min;
ml.location=q;
label=1;
}
}
if (label) groupdivide.push_back(ml.location);
return ml;
}
void main()
{
cost_simple(deg);
DP(deg);
system("pause");
}


...全文
218 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧