UVA-10688

Posted towboa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA-10688相关的知识,希望对你有一定的参考价值。

有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的,所有比它重量轻的都是苦的,比它重的都是酸的。为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果就必须把它吃完,不管苹果是苦的还是酸的。

例如,先吃#1,
如果#1是甜的,花费1
如果#2是甜的,那么选择吃#3,不管#3是什么味道,都可以推测出#2和#4的味道,那么花费1+3
如果#3是甜的,第二次选择吃#3, 共花费1+3 = 4
如果#5是甜的,方案和上面一样, 共花费1+3 = 4
总共1+4+4+4 = 13,这方案更好。

给出n和k,问最少的吃的苹果总重量是多少?

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N= 503 ;
 int n,m,f[N][N]; 
 int dp(int l,int r)
 	if(l>r) return 0;
 	if(f[l][r]!=-1) return f[l][r]; 
 	if(l==r ) return f[l][r];
 	int t= 1e9; 
 	for(int k=l;k<=r;k++)
 		t=min(t,dp()+f[k+1][r]+(k+m)*(r-l+1));
 		
 	return f[l][r] =t; 
 
 
 signed main()
 	int tes;cin>>tes;
 	int cas=0;
 	while(tes--)
 		cin>>n>>m;
 		memset(f,-1,sizeof f) ;
 		
 		printf("Case %d: %d\\n", ++cas,dp(1, n));
 		
 

 

 

UVa中国麻将(Chinese Mahjong,Uva 11210)

简单的回溯题

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 char *mahjong[]={
 8                                 "1T","2T","3T","4T","5T","6T","7T","8T","9T",
 9                                 "1S","2S","3S","4S","5S","6S","7S","8S","9S",
10                                 "1W","2W","3W","4W","5W","6W","7W","8W","9W",
11                                 "DONG","NAN","XI","BEI",
12                                 "ZHONG","FA","BAI"
13                                 };
14 
15 int convert(char *s)//映射处理
16 {
17     for(int i=0;i<34;i++)
18         if(strcmp(mahjong[i],s)==0)
19             return i;
20     return -1;
21 }
22 
23 int c[34];
24 
25 bool search(int dep)
26 {
27     for(int i=0;i<34;i++)//枚举刻子
28         if(c[i]>=3)
29         {
30             if(dep==3) return true;
31             c[i]-=3;
32             if(search(dep+1)) return true;
33             c[i]+=3;
34         }
35     for(int i=0;i<34;i++)//枚举顺子
36         if(i%9<=6&&c[i]>=1&&c[i+1]>=1&&c[i+2]>=1)
37         {
38             if(dep==3) return true;
39             c[i]--;c[i+1]--;c[i+2]--;
40             if(search(dep+1)) return true;
41             c[i]++;c[i+1]++;c[i+2]++;
42         }
43     return false;
44 }
45 
46 bool check()
47 {
48     for(int i=0;i<34;i++)//枚举将牌
49         if(c[i]>=2)
50         {
51             c[i]-=2;
52             if(search(0)) return true;
53             c[i]+=2;
54         }
55     return false;
56 }
57 
58 int main()
59 {
60     int casen=0;
61     int mj[15];
62     char s[100];
63     bool ok;
64     while(cin>>s)
65     {
66         if(s[0]==0) break;
67         printf("Case %d:",++casen);
68         mj[0]=convert(s);
69         for(int i=1;i<13;i++)
70         {
71             cin>>s;
72             mj[i]=convert(s);
73         }
74         ok=false;
75         for(int i=0;i<34;i++)//枚举听牌
76         {
77             memset(c,0,sizeof(c));
78             for(int j=0;j<13;j++) c[mj[j]]++;
79             if(c[i]>=4) continue;
80             c[i]++;
81             if(check())
82             {
83                 ok=true;
84                 printf(" %s",mahjong[i]);
85             }
86             c[i]--;
87         }
88         if(!ok)
89             printf(" Not ready");
90         printf("\n");
91     }
92     return 0;
93 }

 

以上是关于UVA-10688的主要内容,如果未能解决你的问题,请参考以下文章