Dp_081008day3

原创 2012年03月29日 22:08:20

        今天做了几道Dp题。一道枚举,两道线性Dp,一道Dp的优化。总结如下:

                1、注意数据范围,有时对答案取模时,在递推的时候仍有可能超出范围,需注意。

                2、尽量用更少的维数表示状态,否则有时状态转移起来会更麻烦,能用线性的绝不用二维三维。

                3、注意特殊情况的特殊处理,注意题述细节。

                4、Dp的优化可以从减少决策数和减少维数方面考虑。减少决策数时可以考虑改变递推方向,减少维数时要充分利用题意。

 

ProblemSetter.cpp_code:

#include<iostream>
using namespace std;
const int MXN=50;
int main()
{
	freopen("ProblemSetter.in","r",stdin);
	freopen("ProblemSetter.out","w",stdout);
	int n,i,j,k,x=0,y=0,z=0,a[MXN];
	scanf("%d",&n);
	for(i=0;i<n;i++)	scanf("%d",&a[i]);
	sort(a,a+n);
	for(i=0;i<n;i++)
		for(k=n-1;k>=i+2;k--)
			for(j=i+1;j<k;j++)
				if (x+y+z==0||abs(a[i]+a[k]-2*a[j])<abs(a[x]+a[z]-2*a[y])) {
					x=i;
					y=j;
					z=k;					
				}
	printf("%d %d %d\n",a[x],a[y],a[z]);
	return 0;
}


SegmentDisplay.pas_code:

const
		MM=1000000007;
var
        n,i:longint;
        f:array[-6..500010] of qword;
Begin
        assign(input,'SegmentDisplay.in');    reset(input);
        assign(output,'SegmentDisplay.out');   rewrite(output);
        readln(n);
        fillchar(f,sizeof(f),0);
        f[0]:=1;
        for i:=1 to n do
                f[i]:=(f[i-2]+f[i-3]+f[i-4]+3*f[i-5]+3*f[i-6]+f[i-7])mod MM;
        if n>6 then writeln((f[n]-f[n-6]+MM)mod MM)
        else if n>0 then writeln(f[n]) else writeln(0);
        close(input);   close(output);
end.


 

combination.pas_code:

const
        MM=987654321;
var
        f:array[0..1000] of longint;
        prime,vis:array[0..1000000] of boolean;
        n,i,j:longint;
        a,sum:array[0..1000] of longint;
  function isP(t:longint):boolean;
    var i:longint;
    begin
        if vis[t] then exit(prime[t]);
        if t<2 then exit(false);
        if t=2 then exit(true);
        vis[t]:=true;
        for i:=2 to trunc(sqrt(t)) do
                if t mod i=0 then begin
                        prime[t]:=false;
                        exit(false);
                        end;
        prime[t]:=true;
        exit(true);
    end;
Begin
        assign(input,'combination.in');         reset(input);
        assign(output,'combination.out');       rewrite(output);
        readln(n);
        for i:=1 to n do begin
			read(a[i]);
			sum[i]:=sum[i-1]+a[i];
			end;
        fillchar(vis,sizeof(vis),false);
        f[0]:=1;
	for i:=1 to n do begin
	      	f[i]:=0;
	      	for j:=0 to i-1 do
	       		if isP(sum[i]-sum[j]) then f[i]:=(f[i]+f[j])mod MM;
	       	end;
	writeln(f[n]);
	close(input);	close(output);
end.


 

 

 service.cpp_code:

#include<iostream>
using namespace std;
const int MXL=210;
const int MXN=1010;
const int MX=10000000;
int c[MXL][MXL],s[MXN];
int f[MXL][MXL],g[MXL][MXL];
int main()
{
	freopen("service.in","r",stdin);
	freopen("service.out","w",stdout);
	int l,n,i,j,k;
	scanf("%d%d",&l,&n);
	for (i=1;i<=l;++i)
		for (j=1;j<=l;++j) scanf("%d",&c[i][j]);
	for (i=1;i<=n;++i) scanf("%d",&s[i]);
	s[0]=1;
	memset(f,1,sizeof(f));
	memset(g,1,sizeof(g));
	f[2][3]=0;
	for (i=0;i<n;++i) {
		for (j=1;j<=l;++j)
			for (k=j+1;k<=l;++k) if (f[j][k]<MX) {
				if (j!=s[i+1] && k!=s[i+1])
					g[j][k]=min(g[j][k],f[j][k]+c[s[i]][s[i+1]]);
				if (s[i]!=s[i+1] && k!=s[i+1])
					if (s[i]<k) g[s[i]][k]=min(g[s[i]][k],f[j][k]+c[j][s[i+1]]);
					else g[k][s[i]]=min(g[k][s[i]],f[j][k]+c[j][s[i+1]]);
				if (s[i]!=s[i+1] && j!=s[i+1])
					if (s[i]<j) g[s[i]][j]=min(g[s[i]][j],f[j][k]+c[k][s[i+1]]);
					else g[j][s[i]]=min(g[j][s[i]],f[j][k]+c[k][s[i+1]]);				
			}
		for (j=1;j<=l;++j)
			for (k=j+1;k<=l;++k) f[j][k]=g[j][k],g[j][k]=MX;
	}
	int ans=MX;
	for (j=1;j<=l;++j)
		for (k=j+1;k<=l;++k) ans=min(ans,f[j][k]);
	cout<<ans<<endl;
}


 

[概率DP][多项式取模] NOI2017.day1 T3 泳池

lzz写了题解,但是我没看懂… 就自己想了个DP f(i,j)表示高度为i,长度为j的局域,i这个行存在障碍,前i-1行不存在障碍,能选取的区域...
  • Coldef
  • Coldef
  • 2017年07月24日 15:03
  • 623

【状压DP】NOIP2016Day2T3[愤怒的小鸟]题解

解题报告好像是比较简单的状压DP,我有一个数组没有清 00 ,如果是全国联赛就炸了……定义 f[s]f[s] 表示状态为 ss 的最优解,那么每次枚举 ii 和 jj ,用一条抛物线穿过去,并计算出新...

【NOIP2017DAY1T3 【NOIP2017提高组正式赛】逛公园 】(拓扑序DP+分层)

Linkhttps://jzoj.net/senior/#contest/show/2180/2Problem题目大意:给定一个有向图,求从起点到终点有多少条路径代价不超过最短路代价+kSolutio...

NOIP2014 Day1T3 飞扬的小鸟 dp

实际上是一道非常水的dp(怪不得那年分数线上了500),当时写的急了直接用dp[i][j][0]表示上一次下降和dp[i][j][1]表示上升结果WA。。没办法了只能认真分析。实际上        f...

noip2016 Day1 T3:换教室 (期望值+floyd+dp)

换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况中情合适的课程。 在可以选择的课程中,有2n节课程安排在n个时间段上。在第 i ( 1≤ i≤n)个时同段上,两节内容相...
  • KsCla
  • KsCla
  • 2016年12月05日 20:07
  • 307

ICPCCamp2017 Day 3 F Median on Binary Tree(树dp)

觉的不写博客不行了,要不然以后都忘了= = 大体题意: 给你一个完全二叉树,标号为层次标号1~n,定义一个a(0 求每个a的最大值。 思路: 题意很绕,比赛没做出来。 观察a的值,(k-a...

每日三题-Day3-B(HDU 1260 Tickets 基础DP)

原题地址 Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot...

SDOI2016 R1 day2 T3 征途 斜率优化DP

我们写出式子 fi,j=fk,j-1+(si-sk)^2,然后固定一个j,哗哗就出来了 又是今天的T3,然而傻逼到不会写写了个错的70分滚粗 那么傻逼的题都只有230,这是滚大粗的节奏啊 /* ...
  • BPM136
  • BPM136
  • 2016年04月25日 22:37
  • 911

2017.10.30闵神讲课DAY3(DP状态压缩)

DP利用数据结构优化例题: 给定一个集合,从中选出一个最长的等差数列。 集合大小...
  • bbbblzy
  • bbbblzy
  • 2017年10月30日 09:05
  • 49

PROFIBUS DP协议芯片APC3数据手册

  • 2015年05月27日 18:49
  • 1.07MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dp_081008day3
举报原因:
原因补充:

(最多只允许输入30个字)